A blog about Code, the Web and Cyberculture. http://martin-thoma.com/ A blog about Code, the Web and Cyberculture. And a bit about math. And some personal bits. en-us Sun, 05 Jan 2014 15:44:27 +0100 Sun, 05 Jan 2014 15:44:27 +0100 How to use Jekyll with GitHub http://martin-thoma.com/jekyll-and-git Mon, 09 Dec 2013 00:00:00 +0100 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/jekyll-and-git <p>You&#39;ve probably noticed that I didn&#39;t write any posts the last few weeks. The reason is that I&#39;ve migrated my WordPress Blog to Jekyll. This means it takes some source files and generates purely static pages from that. The generation process is independant of user requests.</p> <p><a href="http://jekyllrb.com/">Jekyll</a> is a static blog generator, just like <a href="http://blog.getpelican.com/">Pelican</a>, <a href="http://ringce.com/hyde">Hyde</a>, <a href="http://nanoc.ws/">nanoc</a> and <a href="http://octopress.org/">Octopress</a>.</p> <h2>Jekyll compared with WordPress</h2> <p>Jekyll is a static site generator. This means you have the source files on your computer. Then you generate the website with Jekyll and upload only the generated files. So you only push content to the server, but you don&#39;t have to download anything from the server.</p> <p>Reasons for Jekyll: <ul> <li><strong>Security</strong>: With Jekyll, you only upload static files (HTML, CSS, JavaScript, Images, ...). There is nothing where the user can pass some data. This also means there is one thing less to update.<br/> Assuming your provider updates your server software (e.g. Apache) you don&#39;t have to update anything. In contrast, when you don&#39;t regularly install updates on your WordPress blog (and hope that those updates don&#39;t break anything), your blog is quite likely to be hacked.</li> <li><strong>Speed</strong>: The webserver needs only to serve the sites. Nothing else. Of course, when you use caching with PHP you might get into a similar situation with WordPress. But it will never be faster.</li> <li><strong>Hosting</strong>: You only need webspace. This reduces hosting cost significantly. Additionally, you can use <a href="http://aws.amazon.com/s3/">Amazon S3</a> for hosting!</li> <li><strong>Backups</strong>: Creating security backups is VERY easy with Jekyll. Every tool that can make bakups of files can backup your Jekyll blog. No need to worry about databases. If a file is corrupt, only that file is affected. No worries about maximum execution time for importing / exporting backups. No need to get SSH access. Simple FTP access does the job.</li> </ul></p> <p>Reasons for WordPress: <ul> <li><strong>Comments</strong>: There is no way to get comments only with static pages. So you need something else, e.g. <a href="http://disqus.com/">disqus</a>.</li> <li><strong>Search</strong>: Could probably be done with JavaScript, but I guess it is difficult.</li> <li><strong>RSS Feeds</strong>: WordPress generates valid RSS feeds, Jekyll does not (according to <a href="http://validator.w3.org/feed/">validator.w3.org/feed</a>, tested with <a href="http://martinthoma.github.io/feed">this Jekyll feed</a> generated by <a href="http://github.com/agelber/jekyll-rss">jekyll-rss</a> and <a href="http://martin-thoma.com/feed">that WordPress feed</a>).</li> <li><strong>Editor</strong>: WordPress gives you a WYSIWYG editor. I don&#39;t know if there is something similar for Jekyll.</li> <li><strong>Compile time</strong>: Compilation time is very long for Jekyll. For my blog, it needs over 6 minutes. As I test the result quite often before I publish posts, this is very annoying.</li> <li><strong>Tagging, Category pages, Author pages</strong>: Currently, Jekyll lacks basic support for blogging. You don&#39;t have tag pages per default, the plugins that provide tags don&#39;t have paginated tag index pages. The same problem occurs when it comes to categories or authors.</li> <li><strong>Timed posts</strong>: I did not use timed posts very often, but it is very easy to create them with WordPress. With Jekyll, on the other hand, you have to know how to create cronjobs. And your computer has to be running.</li> </ul></p> <h2>GitHub</h2> <h3>Create your repository</h3> <ol> <li>Go to <a href="https://github.com/">github.com</a>, sign in and create a new repo:</li> <li>Call it <code>[Username].github.io</code>.</li> </ol> <h3>Branches</h3> <p>The way to use Jekyll with GitHub is by using branches. Go to your Git repository that cointains your blog:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">moose@pc08 ~/Downloads/MartinThoma.github.io <span class="nv">$ </span>ls _config.yml favicon.ico index.html Makefile Readme.md css images js _plugins _site _drafts _includes _layouts _posts thumbs </code></pre></div> <p>Now you should create a new branch that will contain your source files. The following command creates a branch <code>sources</code> that starts where the branch <code>master</code> currently is:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">git checkout -b <span class="nb">source </span>master </code></pre></div> <p>Now update this branch to the server:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">git push -u origin <span class="nb">source</span> </code></pre></div> <p>When you enter</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">git checkout . master </code></pre></div> <p>you will switch to the <code>master</code> brach. The same way you can switch to the <code>source</code> branch. After you&#39;ve entered the command, you can look at the folder in your file system. There will only be the data of the current branch.</p> <h3>Custom Domain</h3> <p>If you want to host your content at GitHub, but have a custom Domain like <code>martin-thoma.com</code> instead of <code>martinthoma.github.io</code>, you have to:</p> <ol> <li>Ask your provider (in my case &quot;Knallhart&quot;) to add an A-record to Github.</li> <li>Add a file called <code>CNAME</code> with content <code>martin-thoma.com</code> (yes, without <code>http://</code>) to the root of your directory</li> </ol> <p>GitHub also offers some help on <a href="https://help.github.com/articles/setting-up-a-custom-domain-with-pages">setting up a custom domain with Pages</a>.</p> <h2>FTP Server</h2> <p>If you have your own FTP server, you probably want to use it.</p> <p>One tool that might now come to your mind is <code>rsync</code>. But rsync needs SSH (<a href="http://serverfault.com/a/24627/113899">source</a>). If you have SSH, then you can do something like this:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">rsync -avz --delete _site/ user@host:/path/to/web/root </code></pre></div> <p>The <code>--delete</code> options &quot;delete[s] extraneous files from dest dirs&quot;, <code>-a</code> means archive which preserves the owner, group, change date and some more of files, <code>-v</code> is verbose as always and <code>-z</code> is for compression while the file transfer happens. <code>--progress</code> might also be interesting, especially for the first upload.</p> <p>Otherwise, you might want to try <code>curlftpfs</code>. This program lets you mount a FTP folder:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">curlftpfs ftp.example.com/backups /mnt/ftpserver </code></pre></div> <p>and you can also umount it:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">rsync --delete /var/backups /mnt/ftpserver </code></pre></div> <h2>Markdown</h2> <p>I&#39;ve switched between <code>rdiscount</code> and <code>redcarpet</code>. The former is faster, the latter supports fenced code blocks. I finally stuck with redcarped, because Liquid has problems when it comes to C++ for loops after curly braces.</p> <p>Other Markdown parsers are <code>maruku</code> (which has a <a href="https://github.com/bhollis/maruku/issues/121">Multiple lines for HTML &lt;li&gt;-tag</a> issue) and <code>kramdown</code> (which is slow).</p> <h3>Linebreaks and newline</h3> <p>Linebreaks are an issue. Sometimes I want to get a <code>&lt;br/&gt;</code>, sometimes I make linebreaks to make reading of the text files easier. It&#39;s basically <a href="http://meta.stackoverflow.com/questions/26011/should-the-markdown-renderer-treat-a-single-line-break-as-br">this discussion</a>.</p> <p>Currently, I&#39;m not satisfied with the situation. I never had that problem with WordPress. WordPress simply created paragraphs just at the right location.</p> <h2>Customization</h2> <p>You can create <a href="http://jekyllrb.com/docs/plugins/">custom Liquid filters</a>, plugins and templates. Everything is quite easy. The Liquid templating language seems to be very similar to Django Templates (Python).</p> <h2>Make the Website super-fast</h2> <h3>CSS Minification</h3> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">sudo gem install juicer juicer install jslint juicer install yui_compressor </code></pre></div> <h3>Images</h3> <p>I&#39;ve included small images as base64 (used <a href="http://webcodertools.com/imagetobase64converter/Create">this online tool</a>). According to <a href="http://caniuse.com/datauri">caniuse</a> it&#39;s quite save to use.</p> <h2>Site Search</h2> <p>Site search is a real problem. I&#39;ve seen three solutions so far:</p> <ol> <li><strong>Dynamic Search</strong>: You can add a dynamic part to your statically generated website. For example, I create a <code>search/index.php</code> and a SQLite database.</li> <li><strong>Static JavaScript</strong>: Create a JSON file or something similar and search dynamically with JavaScript in it.</li> <li><strong>External Search Engines</strong>: You could use a search engine for searching your site, of course. <ul> <li>Hosted by you:</li> <li>Commercial <ul> <li><a href="https://www.google.com/cse">Google Custom Search</a></li> <li><a href="http://www.indexden.com/">Index Den</a>: Has no direct support to parse your website</li> </ul></li> </ul></li> </ol> <p>http://www.businessguide.co.uk/blog/jekyll-search-ways-to-search-a-static-site/</p> <p>http://www.mzlinux.org/?q=node/435</p> <h3>PHP+SQLite</h3> <h3>JavaScript solutions</h3> <p>One JavaScript solution I&#39;ve found is <a href="https://github.com/slashdotdash/jekyll-lunr-js-search">lunr</a>. This one is really bad as it copies the whole body to a json file. This json file has to be loaded before it works. But my posts total at the moment to 2MB. I&#39;m pretty sure my readers don&#39;t want to wait until 2MB are downloaded. So this one does only work for smaller websites.</p> <p><a href="http://christian-fei.com/simple-jekyll-search-jquery-plugin/">Christan Fei&#39;s solution</a> does only search in the title and category.</p> <h2>Templates</h2> <p>Jekyll uses Liquid as a templating language. It is similar to Django templates. <a href="https://github.com/Shopify/liquid/wiki/Liquid-for-Designers">Here</a> is a short introduction to Liquid.</p> <h2>Some tests</h2> <ul> <li><a href="http://validator.w3.org/check?uri=martin-thoma.com">validator.w3.org</a>: My site is HTML-valid. The error that this validator shows is caused by an bug inside of the validator itself.</li> <li><a href="http://jigsaw.w3.org/css-validator/validator?uri=martin-thoma.com">jigsaw.w3.org</a>: My site is CSS-valid.</li> <li><a href="http://tools.pingdom.com/">tools.pingdom.com</a>: The speed could be better</li> </ul> <h2>Resources</h2> <ul> <li><a href="https://help.github.com/articles/setting-up-a-custom-domain-with-pages#setting-the-domain-in-your-repo">Setting up a custom domain with Pages</a></li> <li><a href="https://alybadawy.com/developing/2013/08/02/search-a-jekyll-generated-website/">Search a Jekyll-generated website</a></li> <li><a href="http://philipm.at/2011/jekyll_vs_hyde.html">Jekyll vs. Hyde - A Comparison Of Two Static Site Generators</a></li> </ul> How to check if a point is inside of a polygon? http://martin-thoma.com/check-point-inside-polygon Mon, 18 Nov 2013 20:36:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/check-point-inside-polygon <p>Suppose you have a with <code>$n$</code> sides. This is called a <code>$n$</code>-glon.</p> <h2>Basics about polygones</h2> <p>A <code>$n$</code>-glon can be defined by a list of <code>$n$</code> points.</p> <p>Note that the order is important:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/11/polygon-order.png"><img src="../images/2013/11/polygon-order.png" alt="[A, B, C, D, E, F, G] != [A, B, C, D, F, E, G]" width="512" height="233" class=""/></a><p class="wp-caption-text">[A, B, C, D, E, F, G] != [A, B, C, D, F, E, G]</p></div> <p>I will not consider self-intersecting polygones for the following statements. I&#39;m aware of them, but whenever you have a self-intersecting polygon you can create multiple polygones that cover the same area and don&#39;t intersect each other (some pairs might have a finite number of points in common, but not an infinite number).</p> <h2>Is a point in a triangle / a rectangle</h2> <p>It is quite easy to check weather a point is inside of a triangle or inside of a rectangle. I have already written an article about <a href="../how-to-check-if-a-point-is-inside-a-rectangle/">how to check if a point is inside of a rectangle</a>.</p> <h2>Is a point inside of a n-glon?</h2> <p>Let <code>$P$</code> be a point and <code>$N = [P_1, P_2, \dots, P_n]$</code> be a <code>$n$</code>-glon. It is now much more difficult to check if <code>$P$</code> is inside of <code>$N$</code>. The area-approach works for convex <code>$n$</code>-glons, but that&#39;s it.</p> <h3>Count Crossing Line Segments</h3> <p>However, you can try another approach which I have visualized in the following image:</p> <div style="width: 512px" class="wp-caption "><a href="../images/2013/11/polygon-is-point-inside.png"><img src="../images/2013/11/polygon-is-point-inside.png" alt="Check if P is inside of N" width="512" height="481" class="size-full wp-image-76730"/></a><p class="wp-caption-text">Check if P is inside of N</p></div> <p>When <code>$P$</code> is inside of <code>$N$</code>, every line <code>$P_{1}P, P_{2}P, \dots, P_{n}P$</code> will cross the polygon lines <code>$P_{1}P_2,P_{2}P_3, \dots, P_{n}P_1$</code> an even number of times. If P is outside, at least one of the lines <code>$P_{i}P$</code> will cross a polygon line <code>$P_{j}P_{j+1}$</code> once.</p> <p>This means, for every check you have to check <code>$n^2$</code> pairs of line segments for crossings. How you can do that is explained in my article <a href="../how-to-check-if-two-line-segments-intersect/" title="How to check if two line segments intersect">How to check if two line segments intersect</a>.</p> <p>This algorithm is in <code>$\mathcal{O}(n^2)$</code> time complexity (it does need a constant amount of additional space).</p> <h3>Triangularization</h3> <p>When you have a lot of querys, you might want to divide your polygon into convex polygones. The easiest way to do this might be dividing <code>$N$</code> into triangles. </p> <p>That way, you can check for every triangle if <code>$P$</code> is inside of it. I assume that the number of triangles is not bigger than <code>$n$</code>. As the check is in constant time for one triangle, you would have an algorithm that needs <code>$\mathcal{O}(n)$</code> time and space for its checks (+ some preprocessing which is done only once).</p> Word Error Rate Calculation http://martin-thoma.com/word-error-rate-calculation Fri, 15 Nov 2013 07:59:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/word-error-rate-calculation <p>The Word Error Rate (short: WER) is a way to measure performance of an <abbr title="Automatic Speech Recognizer">ASR</abbr>. It compares a reference to an hypophysis and is defined like this:</p> <p><code> $$\mathit{WER} = \frac{S+D+I}{N}$$</code></p> <p>where <ul> <li>S is the number of substitutions,</li> <li>D is the number of deletions,</li> <li>I is the number of insertions and</li> <li>N is the number of words in the reference</li> </ul></p> <h2>Examples</h2> <pre>REF: What a bright day HYP: What a day</pre> <p>In this case, a deletion happened. &quot;Bright&quot; was deleted by the ASR.</p> <pre>REF: What a day HYP: What a bright day</pre> <p>In this case, an insertion happened. &quot;Bright&quot; was inserted by the ASR.</p> <pre>REF: What a bright day HYP: What a light day</pre> <p>In this case, an substitution happened. &quot;Bright&quot; was substituted by &quot;light&quot; by the ASR.</p> <h2>Range of values</h2> <p>As only addition and division with non-negative numbers happen, WER cannot get negativ. It is 0 exactly when the hypophysis is the same as the reference.</p> <p>WER can get arbitrary large, because the ASR can insert an arbitrary amount of words.</p> <h2>Calculation</h2> <p>Interestingly, the WER is just the Levenshtein distance for words.</p> <p>I&#39;ve understood it after I saw this on the German Wikipedia:</p> <p><code> $$ \begin{align} m &amp;= |r|\\ n &amp;= |h|\\ \end{align} $$</code></p> <p><code> $$ \begin{align} D_{0, 0} &amp;= 0\\ D_{i, 0} &amp;= i, 1 \leq i \leq m\\ D_{0, j} &amp;= j, 1 \leq j \leq n \end{align}$$</code></p> <p><code> $$ \text{For } 1 \leq i\leq m, 1\leq j \leq n\\ D_{i, j} = \min \begin{cases} D_{i - 1, j - 1}&amp;+ 0 \ {\rm if}\ u_i = v_j\\ D_{i - 1, j - 1}&amp;+ 1 \ {\rm(Replacement)} \\ D_{i, j - 1}&amp;+ 1 \ {\rm(Insertion)} \\ D_{i - 1, j}&amp;+ 1 \ {\rm(Deletion)} \end{cases} $$</code></p> <p>But I have written a piece of pseudocode to make it even easier to code this algorithm:</p> <div style="width: 500px" class="wp-caption "><a href="../images/2013/11/WER-calculation.png"><img src="../images/2013/11/WER-calculation.png" alt="WER calculation" width="500" height="494" class="size-full wp-image-76716"/></a><p class="wp-caption-text">WER calculation</p></div> <h2>Python</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="k">def</span> <span class="nf">wer</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> Calculation of WER with Levenshtein distance.</span> <span class="sd"> Works only for iterables up to 254 elements (uint8).</span> <span class="sd"> O(nm) time ans space complexity.</span> <span class="sd"> &gt;&gt;&gt; wer(&quot;who is there&quot;.split(), &quot;is there&quot;.split()) </span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; wer(&quot;who is there&quot;.split(), &quot;&quot;.split()) </span> <span class="sd"> 3</span> <span class="sd"> &gt;&gt;&gt; wer(&quot;&quot;.split(), &quot;who is there&quot;.split()) </span> <span class="sd"> 3</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="c"># initialisation</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="n">d</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">numpy</span><span class="o">.</span><span class="n">uint8</span><span class="p">)</span> <span class="n">d</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">d</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span> <span class="k">elif</span> <span class="n">j</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span> <span class="c"># computation</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">r</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">h</span><span class="p">[</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">substitution</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">insertion</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">deletion</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">substitution</span><span class="p">,</span> <span class="n">insertion</span><span class="p">,</span> <span class="n">deletion</span><span class="p">)</span> <span class="k">return</span> <span class="n">d</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)][</span><span class="nb">len</span><span class="p">(</span><span class="n">h</span><span class="p">)]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">doctest</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span> </code></pre></div> <h2>Explanation</h2> <p>No matter at what stage of the code you are, the following is always true: <ul> <li>If <code>r[i]</code> equals <code>h[j]</code> you don&#39;t have to change anything. The error will be the same as it was for <code>r[:i-1]</code> and <code>h[:j-1]</code></li> <li>If its a substitution, you have the same number of errors as you had before when comparing the <code>r[:i-1]</code> and <code>h[:j-1]</code></li> <li>If it was an insertion, then the hypophysis will be longer than the reference. So you can delete one from the hypophysis and compare the rest. As this is the other way around for deletion, you don&#39;t have to worry when you have to delete something.</li> </ul></p> Formatting Strings in Python http://martin-thoma.com/formatting-strings-python Thu, 07 Nov 2013 19:05:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/formatting-strings-python <p>In Python, you can use the following ways to format Strings:</p> <h2>Print directly</h2> <p>Printing them directly (just like <a href="http://www.cplusplus.com/reference/cstdio/printf/">printf in C</a>):</p> <div class="highlight"><pre><code class="python"><span class="n">birthday</span> <span class="o">=</span> <span class="mi">28</span> <span class="n">month</span> <span class="o">=</span> <span class="s">&quot;April&quot;</span> <span class="n">year</span> <span class="o">=</span> <span class="mi">1990</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;My birthday is the </span><span class="si">%i</span><span class="s">-th </span><span class="si">%s</span><span class="s"> </span><span class="si">%i</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">birthday</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="n">year</span><span class="p">))</span> </code></pre></div> <p>The first string contains the rules how to format. <code>%i</code> means that the first argument in the following tuple should be interpreted as a integer. The second one <code>%s</code> should be interpreted as a string and the third one again as a integer.</p> <h2>Save as string</h2> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="n">a</span> <span class="o">=</span> <span class="s">&quot;Why is </span><span class="si">%i</span><span class="s"> the answer?&quot;</span> <span class="o">%</span> <span class="mi">42</span> <span class="o">&gt;&gt;&gt;</span> <span class="n">a</span> <span class="s">&#39;Why is 42 the answer?&#39;</span> </code></pre></div> <h2>Named formatting</h2> <p>You might prefer named formatting:</p> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="s">&quot;{guy} loves {girl}.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">girl</span><span class="o">=</span><span class="s">&quot;Marie&quot;</span><span class="p">,</span> <span class="n">guy</span><span class="o">=</span><span class="s">&quot;Martin&quot;</span><span class="p">)</span> <span class="s">&#39;Martin loves Marie.&#39;</span> </code></pre></div> <p>You can also store this first in a dictionary an unpack it:</p> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="n">myDictionary</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;girl&quot;</span><span class="p">:</span><span class="s">&quot;Marie&quot;</span><span class="p">,</span><span class="s">&quot;guy&quot;</span><span class="p">:</span> <span class="s">&quot;Martin&quot;</span><span class="p">,</span><span class="s">&quot;other&quot;</span><span class="p">:</span><span class="s">&quot;Internet&quot;</span><span class="p">}</span> <span class="o">&gt;&gt;&gt;</span> <span class="s">&quot;{guy} loves {girl}.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">girl</span><span class="o">=</span><span class="s">&quot;Marie&quot;</span><span class="p">,</span> <span class="n">guy</span><span class="o">=</span><span class="s">&quot;Martin&quot;</span><span class="p">)</span> <span class="s">&#39;Martin loves Marie.&#39;</span> </code></pre></div> <h2>Date and Time</h2> <p>You can format time any way you like, just look at <a href="http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior">this reference</a>.</p> <h2>Lists</h2> <p>Question: I would like to print a list! How do I do that? Answer: Convert your list to a string</p> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span> <span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Your list: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">myList</span><span class="p">)))</span> <span class="n">Your</span> <span class="nb">list</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span> </code></pre></div> <h2>__str__ and __repr__</h2> <p>When you build your own objects, you should add an implementation for the method <code><strong>str</strong></code> and <code><strong>repr</strong></code>. The first one should return a string representation that is human readable of the object, the second one should return a string that identifies the object.</p> <h2>Formatters</h2> <table> <tr> <td><code>%i</code></td> <td>Integer</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mi">123</span><span class="p">))</span> <span class="mi">123</span> </code></pre></div> </td> </tr> <tr> <td><code>%s</code></td> <td>String</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s">&quot;Martin&quot;</span><span class="p">))</span> <span class="n">Martin</span> </code></pre></div> </td> </tr> <tr> <td><code>%o</code></td> <td>Int as octal</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%o</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mi">173</span> </code></pre></div> </td> </tr> <tr> <td><code>%x</code></td> <td>Int as hexadecimal (lower case)</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%x</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mi">7</span><span class="n">b</span> </code></pre></div> </td> </tr> <tr> <td><code>%X</code></td> <td>Int as hexadecimal (upper case)</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%X</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mi">7</span><span class="n">B</span> </code></pre></div> </td> </tr> <tr> <td><code>%f</code></td> <td>Floating point</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mf">123.123000</span> </code></pre></div> </td> </tr> <tr> <td><code>%.2f</code></td> <td>Floating point with two decimal places</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mf">123.12</span> </code></pre></div> </td> </tr> <tr> <td><code>%e</code></td> <td>Floating point in scientific notation</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%e</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">123.123</span><span class="p">))</span> <span class="mf">1.231230e+02</span> </code></pre></div> </td> </tr> <tr> <td><code>%%</code></td> <td>Percent sign</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%i%%</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mi">65</span><span class="p">))</span> <span class="mi">65</span><span class="o">%</span> </code></pre></div> </td> </tr> <tr> <td><code>%6.2f</code></td> <td>Print a float with 2 decimal places. Add spaces if this has less than 6 characters.</td> <td> <div class="highlight"><pre><code class="python"><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%6.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mf">65.123</span><span class="p">))</span> <span class="mf">65.12</span> </code></pre></div> </td> </tr> </table> <h2>Resources</h2> <ul> <li><a href="http://docs.python.org/2/library/string.html#format-specification-mini-language">Format Specification Mini-Language</a></li> <li><a href="http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior">Time formatting</a></li> <li><a href="http://docs.python.org/2/library/pprint.html">Pretty Print</a></li> </ul> Fibonacci, recursion and decorators http://martin-thoma.com/fibonacci-recursion-decorators Thu, 31 Oct 2013 10:08:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/fibonacci-recursion-decorators <p>I think everybody who learned something about recursion has seen the Fibonacci sequence:</p> <p><code>$ f(n) := \begin{cases} n &amp;\text{if } n \leq 1\\ f(n-1) + f(n-2) &amp;\text{otherwise} \end{cases} $</code></p> <p>The simplest solution to get this number is:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> </code></pre></div> <p>The problem is, of course, that the number of evaluations goes wild. Here is a table of the number of function calls</p> <table> <tr> <th>n</th> <td>0</td> <td>1</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> <td>8</td> <td>9</td> <td>10</td> <td>20</td> </tr> <tr> <th>calls</th> <td>1</td> <td>1</td> <td>3</td> <td>5</td> <td>9</td> <td>15</td> <td>25</td> <td>41</td> <td>67</td> <td>109</td> <td>177</td> <td>21891</td> </tr> </table> <p>To be exact, the number of calls of the fib-function is:</p> <p><code>$ f(n) := \begin{cases} 1 &amp;\text{if } n \leq 1\\ f(n-1) + f(n-2) + 1 &amp;\text{otherwise} \end{cases} $</code></p> <p>This means the dumb function is in <code>$\mathcal{O}(2^n)$</code>! (I&#39;m not quite sure, but this I think this is not only time complexity, but also space complexity. I think it is not <a href="https://en.wikipedia.org/wiki/Tail_recursion">tail recursive</a>, so the complete stackframe has to be saved.)</p> <h2>Memorization with decorators</h2> <p>One way to solve the problem much faster (in fact in <code>$\mathcal{O}(n)$</code> time and space complexity) by storing values we already calculated.</p> <p>A very neat way to achieve this are decorators. It might be a common problem that you have a recursive, mathematical function with no side effects. So you can write a wrapper that checks if the value has already been calculated. If not, the function proceeds as usual. It it has already been calculated, you can simply look it up:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">memoize</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">cache</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">memoizer</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="n">args</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cache</span><span class="p">:</span> <span class="n">cache</span><span class="p">[</span><span class="n">args</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">args</span><span class="p">]</span> <span class="k">return</span> <span class="n">memoizer</span> <span class="nd">@memoize</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> </code></pre></div> <p>Notice that I&#39;ve only added <code>@memoize</code> over the function definiton of <code>fib</code>! I love Python :-)</p> <p>By the way, this formula has also some limitations. Python has a fixed maximum recursion depth. So <code>fib(332)</code> worked fine, but <code>fib(333)</code> gave:</p> <div class="highlight"><pre><code class="bash">RuntimeError: maximum recursion depth exceeded in comparison </code></pre></div> <p>You can get around this limitation by successive calls of fib:</p> <div class="highlight"><pre><code class="python"><span class="c"># Call to fill array</span> <span class="n">fib</span><span class="p">(</span><span class="mi">332</span><span class="p">)</span> <span class="c"># The number of recursive steps is now much smaller:</span> <span class="k">print</span><span class="p">(</span><span class="n">fib</span><span class="p">(</span><span class="mi">500</span><span class="p">))</span> </code></pre></div> <p>That gave 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125. A pretty big number.</p> <h2>Formula of Moivre-Binet</h2> <p>The formula of Moivre-Binet gives a closed form for calculating fibonacci numbers:</p> <p><code>$\varphi = \frac{\sqrt{5}+1}{2}$</code> <code>$\psi = 1 - \varphi$</code> <code>$f(n) = \frac{\varphi^n - \psi^n}{\phi - \psi}$</code></p> <p>Although this is mathematically exact, it will not work on computers due to a fixed floating point precision. Lets check how long it works:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="kn">import</span> <span class="nn">functools</span> <span class="k">def</span> <span class="nf">memoize</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">cache</span> <span class="o">=</span> <span class="p">{}</span> <span class="nd">@functools.wraps</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">memoizer</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="n">args</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cache</span><span class="p">:</span> <span class="n">cache</span><span class="p">[</span><span class="n">args</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">args</span><span class="p">]</span> <span class="k">return</span> <span class="n">memoizer</span> <span class="nd">@memoize</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="k">def</span> <span class="nf">moivreBinet</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">phi</span> <span class="o">=</span> <span class="p">(</span><span class="mi">5</span><span class="o">**</span><span class="mf">0.5</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span> <span class="n">psi</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">phi</span> <span class="k">return</span> <span class="nb">int</span><span class="p">((</span><span class="n">phi</span><span class="o">**</span><span class="n">n</span> <span class="o">-</span> <span class="n">psi</span><span class="o">**</span><span class="n">n</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">phi</span> <span class="o">-</span> <span class="n">psi</span><span class="p">))</span> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">count</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">count</span><span class="p">(</span><span class="mi">0</span><span class="p">):</span> <span class="n">exact</span> <span class="o">=</span> <span class="n">fib</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="n">constTime</span> <span class="o">=</span> <span class="n">moivreBinet</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">if</span> <span class="n">exact</span> <span class="o">!=</span> <span class="n">constTime</span><span class="p">:</span> <span class="k">print</span><span class="p">((</span><span class="s">&quot;The </span><span class="si">%i</span><span class="s">-th fibonacci number is </span><span class="si">%i</span><span class="s">. Moivre-Binet &quot;</span> <span class="o">+</span> <span class="s">&quot;gives due to precicion error </span><span class="si">%i</span><span class="s"> (delta=</span><span class="si">%i</span><span class="s">).&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">exact</span><span class="p">,</span> <span class="n">constTime</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">exact</span><span class="o">-</span><span class="n">constTime</span><span class="p">)))</span> <span class="k">break</span> </code></pre></div> <p>So the answer is:</p> <blockquote>The 72-th fibonacci number is 498454011879264. Moivre-Binet gives due to precicion error 498454011879265 (delta=1).</blockquote> <p>This is a reason to prefer the <code>$\mathcal{O}(n)$</code> solution over the <code>$\mathcal{O}(1)$</code> solution. If you&#39;re only exact for 72 numbers, you could also simply store them. Looking number up form an array is always faster than any calculation.</p> <h2>Very high numbers</h2> <p>The following solution is fast and works 0.075 seconds for the 20000 Fibonacci number (which has 4180 digits).</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">def</span> <span class="nf">accFib</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">Nm2</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">Nm1</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">Nm2</span><span class="p">,</span> <span class="n">Nm1</span> <span class="o">=</span> <span class="n">Nm1</span><span class="p">,</span> <span class="n">Nm1</span><span class="o">+</span><span class="n">Nm2</span> <span class="k">return</span> <span class="n">Nm2</span> <span class="k">return</span> <span class="n">accFib</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </code></pre></div> <h2>Additional ressources</h2> <p>The article on <a href="http://en.literateprograms.org/Fibonacci_numbers_(Python)">literate programs</a> is worth reading. They show some very different programs that calculate Fibonacci numbers.</p> Programmierparadigmen Klausur http://martin-thoma.com/programmierparadigmen-klausur Thu, 24 Oct 2013 10:46:16 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/programmierparadigmen-klausur <div class="info">Dieser Artikel beschäftigt sich mit der Vorlesung &bdquo;Programmierparadigmen&ldquo; am KIT. Er dient als Prüfungsvorbereitung. Ich habe die Vorlesungen bei Herrn Prof. Dr. Snelting im Wintersemester 2013/2014 gehört.</div> <p>Der Artikel wird bis zur Klausur laufend aktualisiert.</p> <h2>Behandelter Stoff</h2> <h3>Vorlesung</h3> <table> <tr> <td style="border-bottom:1px solid black;">23.10.2013</td> <td style="border-bottom:1px solid black;">Funktionale Programmierung <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/intern/10_FunktionaleProgrammierung.pdf">10</a></td> <td style="border-bottom:1px solid black;">Haskell: Quicksort, Listen, <a href="http://learnyouahaskell.com/higher-order-functions#maps-and-filters">Filter</a>, <a href="http://www.haskell.org/haskellwiki/Syntactic_sugar/Cons">Cons-Operator</a></td> </tr> <tr> <td style="border-bottom:1px solid black;">25.10.2013</td> <td style="border-bottom:1px solid black;">Funktionale Programmierung <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/intern/11_FunktionaleProgrammierung.pdf">11</a></td> <td style="border-bottom:1px solid black;">Haskell: filter, map, iter, foldr, foldl, Currying, Extensionalitätsprinzip, Kombinatoren (Summe, Produkt), flatten, cons, zip</td> </tr> <tr> <td style="border-bottom:1px solid black;">30.10.2013</td> <td style="border-bottom:1px solid black;">Funktionale Programmierung <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/intern/12_FunktionaleProgrammierung.pdf">12</a></td> <td style="border-bottom:1px solid black;">Haskell: zipWith, short circuit evaluation, foldl, foldr, Unendliche Listen, Typen, Polymorphie</td> </tr> <tr> <td style="border-bottom:1px solid black;">06.11.2013</td> <td style="border-bottom:1px solid black;"></td> <td style="border-bottom:1px solid black;">Backtracking, Algebraische und rekursive Datentypen, map for trees, Typklassen</td> </tr> <tr> <td style="border-bottom:1px solid black;">08.11.2013</td> <td style="border-bottom:1px solid black;"></td> <td style="border-bottom:1px solid black;">Typklassen, Monaden</td> </tr> <tr> <td style="border-bottom:1px solid black;">13.11.2013</td> <td style="border-bottom:1px solid black;"></td> <td style="border-bottom:1px solid black;">Sichtbarkeitsbereich `$\subseteq$` Gültigkeitsbereich; `$\alpha$` / `$\eta$`-Äqivalenz, Redex; Funktion, die sich als eigenes Argument nimmt; `$\lambda$`-Klakül ist Turing-Mächtig</td> </tr> <tr> <td style="border-bottom:1px solid black;">29.11.2013</td> <td style="border-bottom:1px solid black;">Logische Programmierung</td> <td style="border-bottom:1px solid black;">Prolog</td> </tr> </table> <h3>Übungsblätter</h3> <table> <tr> <th>Übungsblatt</th> <th>Inhalt</th> </tr> <tr> <td><a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/uebung/blaetter/blatt0.pdf" rel="nofollow">ÜB 0</a>: Haskell</td> <td>Haskell installieren (siehe <a href="http://wiki.ubuntuusers.de/Haskell">UbuntuUsers</a>), Maximum dreier Zahlen berechnen</td> </tr> <tr> <td><a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/uebung/blaetter/blatt1.pdf" rel="nofollow">ÜB 1</a>: Rekursive Funktionen in Haskell</td> <td>Potenzen, Primzahlen, Sortieren</td> </tr> </table> <h3>Tutorium</h3> <h4>16.12.2013</h4> <div class="highlight"><pre><code class="haskell language-haskell" data-lang="haskell"><span class="kr">let</span> <span class="n">f</span> <span class="ow">=</span> <span class="nf">\</span> <span class="n">x</span><span class="o">.</span><span class="n">plus</span> <span class="n">x</span> <span class="n">x</span> <span class="kr">in</span> <span class="n">f</span> <span class="p">(</span><span class="n">f</span> <span class="n">c_2</span><span class="p">)</span> <span class="o">^=</span> <span class="p">(</span><span class="nf">\</span> <span class="n">f</span><span class="o">.</span> <span class="n">f</span> <span class="p">(</span><span class="n">f</span> <span class="n">c_2</span><span class="p">))</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span><span class="o">.</span> <span class="n">plus</span> <span class="n">x</span> <span class="n">x</span><span class="p">)</span> </code></pre></div> <p><code>let</code> wird wegen dem Typsystem benötigt (<code>let</code> ist polymorph, <code>$\lambda$</code>-Term nicht).</p> <div class="highlight"><pre><code class="haskell language-haskell" data-lang="haskell"><span class="kr">let</span> <span class="n">f</span> <span class="ow">=</span> <span class="nf">\</span><span class="n">x</span><span class="o">.</span><span class="mi">1</span> <span class="kr">in</span> <span class="p">(</span><span class="n">f</span> <span class="mi">7</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="s">&quot;a&quot;</span><span class="p">])</span> <span class="o">^=</span> <span class="p">(</span><span class="nf">\</span> <span class="n">f</span><span class="o">.</span> <span class="p">)</span> <span class="p">(</span><span class="nf">\</span> <span class="n">x</span><span class="o">.</span> <span class="mi">1</span><span class="p">)</span> <span class="n">f</span><span class="kt">:</span> <span class="nf">\</span><span class="n">alpha_5</span> <span class="ow">-&gt;</span> <span class="n">int</span> <span class="n">f</span><span class="kt">:</span> <span class="nf">\</span><span class="n">forall</span> <span class="nf">\</span><span class="n">alpha_5</span><span class="o">.</span> <span class="nf">\</span><span class="n">alpha_5</span> <span class="nf">\</span><span class="n">rightarrow</span> <span class="n">int</span> </code></pre></div> <h2>Material</h2> <ul> <li><a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/">Vorlesungswebsite</a> und <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/uebung/#unterlagen">Übungsblätter</a></li> <li>Ein <a href="https://ankiweb.net/shared/info/3121773115">Anki-Deck</a> (NICHT meines!)</li> </ul> <h2>Übungsbetrieb</h2> <ul> <li>Wo sind die Übungsblätter: <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/uebung/#unterlagen">Link</a></li> <li>Abgabeform: ?</li> <li>Abgabe: ?</li> <li>Rücknahme: ?</li> <li>Turnus: wöchentlich, erscheint am Donnerstag</li> <li>Übungsschein verpflichtend: Es gibt keinen Übungsschein.</li> <li>Bonus durch Übungsschein: Es gibt keinen Klausurbonus.</li> </ul> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Donnerstag, den 10. April 2014 von 14:00 bis 16:00 Uhr <strong>Ort</strong>: steht noch nicht fest (Stand: 10.12.2013) <strong>Punkte</strong>: ? <strong>Bestehensgrenze</strong>: ? <strong>Übungsschein</strong>: Gibt es nicht. <strong>Bonuspunkte</strong>: Gibt es nicht. <strong>Ergebnisse</strong>: steht noch nicht fest (Stand: 10.12.2013) <strong>Einsicht</strong>: steht noch nicht fest (Stand: 10.12.2013) <strong>Erlaubte Hilfsmittel</strong>: (siehe <a href="http://pp.ipd.kit.edu/lehre/WS201314/paradigmen/">Website</a>)</p> <blockquote>Erlaubte Hilfsmittel für die Klausur sind alle Quellen in Papierform, insbesondere <ul> <li>Vorlesungsfolien der Veranstaltung Programmierparadigmen</li> <li>Übungszettel und Beispiellösungen der Veranstaltung Programmierparadigmen</li> <li>Bücher, Ausdrucke und beliebige eigenen Aufzeichnungen</li> </ul> </blockquote> <h2>Ergebnisse</h2> <p>Stehen noch nicht fest (Stand: 10.12.2013).</p> Working with Terminal http://martin-thoma.com/working-terminal Tue, 22 Oct 2013 08:40:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/working-terminal <p>I&#39;ve just switched from <a href="https://en.wikipedia.org/wiki/Bash_(Unix_shell)">Bash</a> to <a href="https://en.wikipedia.org/wiki/Z_shell">ZSH</a> because of <a href="https://github.com/robbyrussell/oh-my-zsh">oh-my-ZSH</a>. I think this is just the right time to explain the words Shell, command line, Terminal, Bash and ZSH.</p> <p><a href="https://en.wikipedia.org/wiki/GNOME_Terminal">Terminal</a> is an terminal emulator, sometimes also called a &quot;terminal window&quot;. I work in a window environment (MATE) and I want to use command line tools within that environment. So I need a &quot;terminal window&quot;: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/10/teriminal-window-300x168.png"><img src="../images/2013/10/teriminal-window-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-76644"/></a><p class="wp-caption-text"></p></div></p> <p>ZSH and Bash are both Unix shells. A shell is a command line interpreter that provides a text-based user interface.</p> <p>Command line describes the textual way you interact with the computer. When you&#39;re in a graphical user interface situation you interact by manipulating windows with your keyboard/mouse. When you&#39;re in a text-based user interface situation, you interact by entering commands in a line (hence command line).</p> <h2>Oh-my-ZSH Installation</h2> <p>Oh-my-ZSH is a plugin for ZSH. I think this plugin is very good and makes a big difference to Bash. So when you look at the screenshots below, keep in mind that this is not a &quot;plain vanilla&quot; zsh.</p> <ul> <li>Install "<a href="https://github.com/robbyrussell/oh-my-zsh">Oh-my-ZSH</a>"</li> <li>Install "<a href="https://github.com/Lokaltog/powerline-fonts">powerline fonts</a>" and change your Terminal font to one of them</li> <li>Change your Terminal theme to "agnoster" by setting <code>ZSH_THEME="agnoster"</code> in <strong>~/.zshrc</strong> </li> <li>Set your terminal theme to "Solarized Dark" (<a href="http://www.mintmate.org/?p=13">description</a>)</li> <li>Make ZSH your default Shell in MATE Terminal (<a href="http://askubuntu.com/a/342342/10425">description</a>) and eventually <code>sudo chsh -s /usr/bin/zsh username</code></li> </ul> <h2>ZSH and Bash</h2> <p>Here are some differences. On the left side is zsh, on the right is bash: <ul class="gallery mw-gallery-traditional"><li class="gallerybox" style="width: 155px"><div style="width: 155px"><div class="thumb" style="width: 150px;"><div style="margin:21px auto;"><a href="76663" class="image"><img src="76663" alt="" width="120" height="108"/></a></div></div><div class="gallerytext"></div></div></li><li class="gallerybox" style="width: 155px"><div style="width: 155px"><div class="thumb" style="width: 150px;"><div style="margin:21px auto;"><a href="76664" class="image"><img src="76664" alt="" width="120" height="108"/></a></div></div><div class="gallerytext"></div></div></li><li class="gallerybox" style="width: 155px"><div style="width: 155px"><div class="thumb" style="width: 150px;"><div style="margin:21px auto;"><a href="76665" class="image"><img src="76665" alt="" width="120" height="108"/></a></div></div><div class="gallerytext"></div></div></li><li class="gallerybox" style="width: 155px"><div style="width: 155px"><div class="thumb" style="width: 150px;"><div style="margin:21px auto;"><a href="76666" class="image"><img src="76666" alt="" width="120" height="108"/></a></div></div><div class="gallerytext"></div></div></li></div></p> <p>I like the time command of bash more, but that&#39;s it. All other interactions are either almost the same or better in zsh. I especially like that zsh doesn&#39;t print everything again when you autocomplete with tab. And it also autocompletes when you make an capitalization error.</p> <p>I also begin to like the Git-specific prompt indicators: <div style="width: 236px" class="wp-caption aligncenter"><a href="../images/2013/10/oh-my-zsh-git-added.png"><img src="../images/2013/10/oh-my-zsh-git-added.png" alt="" width="236" height="42" class="size-full wp-image-76671"/></a><p class="wp-caption-text"></p></div></p> <h2>Some usefull tools</h2> <h3>ack</h3> <p>You might already know <code>grep</code>. And if you&#39;ve worked with it, you might already have typed something like the following:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">grep --exclude-dir<span class="o">=</span><span class="s2">&quot;.svn&quot;</span> <span class="s2">&quot;searchterm&quot;</span> * grep -rI <span class="s2">&quot;onlytextSearchterm&quot;</span> . </code></pre></div> <p>An alternative to <code>grep</code> is <code>ack</code> (for Ubuntu users: <code>ack-grep</code>). See <a href="http://beyondgrep.com/">beyondgrep.com</a>.</p> Part III: Matrix multiplication on multiple cores in Python, Java and C++ http://martin-thoma.com/part-iii-matrix-multiplication-on-multiple-cores-in-python-java-and-c Mon, 21 Oct 2013 14:39:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/part-iii-matrix-multiplication-on-multiple-cores-in-python-java-and-c <div class="info">This is Part III of my matrix multiplication series. <a href="../matrix-multiplication-python-java-cpp/">Part I</a> was about simple matrix multiplication algorithms and <a href="../strassen-algorithm-in-python-java-cpp/">Part II</a> was about the Strassen algorithm. <a href="../part-iii-matrix-multiplication-on-multiple-cores-in-python-java-and-c/">Part III</a> is about parallel matrix multiplication.</div> <p>We got some pretty interesting results for matrix multiplication so far. Now, I would like to get to know in how far performance increases (or decreases) if I make use of multiple cores. I only have two cores, so I hope somebody with a better computer will also run the ikj single core algorithm form part I and the parallel version from this article and post the results as a comment.</p> <h2>The implementations</h2> <p>As last time, I&rsquo;ve added the scripts to a <a href="https://github.com/MartinThoma/matrix-multiplication">GIT repository</a>. So you can test it on your machine.</p> <p>Before we start implementing code for multiple processors, we have to get an algorithm that is actually parallelisable. You could use <a href="https://en.wikipedia.org/wiki/Cannon%27s_algorithm">Cannon&#39;s algorithm</a>, a algorithm that makes use of <a href="http://en.wikipedia.org/wiki/Systolic_array">systolic arrays</a> or try to find a solution by your own. The <a href="http://www.netlib.org/lapack/lawnspdf/lawn96.pdf">Scalable Universal Matrix Multiplication Algorithm</a> (short: SUMMA) could also work. The paper that I&#39;ve linked is well-written and easy to understand. You should definitively read it, if you&#39;re interested in matrix multiplication.</p> <p>I will not use any advanced algorithm in this article. I will make the outer most for loop of the ikj-algorithm (see part I) execute in parallel.</p> <p>More about parallel matrix multiplication: <ul> <li><a href="http://www.mcs.anl.gov/~itf/dbpp/text/node45.html">Case Study: Matrix Multiplication</a></li> <li><a href="http://berrendorf.inf.fh-bonn-rhein-sieg.de/Parallel/index.html">berrendorf</a></li> <li><a href="http://en.wikipedia.org/wiki/Matrix_multiplication#Algorithms_for_efficient_matrix_multiplication">Algorithms for efficient matrix multiplication</a></li> <li><a href="http://en.wikipedia.org/wiki/Coppersmith%E2%80%93Winograd_algorithm">Coppersmith-Winograd algorith</a></li> </ul></p> <h2>Python</h2> <p>Because of global interpreter lock (GIL), you need to start new processes in Python (<a href="http://stackoverflow.com/a/9786225/562769">source</a>).</p> <p>The ikj single core algorithm implemented in Python needs:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>python ikjMultiplication.py -i 2000.in &gt; 2000-nonparallel.out real 36m0.699s user 35m53.463s sys 0m2.356s </code></pre></div> <p>The most simple way to parallelize the ikj algorith is to use the <a href="http://docs.python.org/2/library/multiprocessing.html">multiprocessing module</a> and compute every line of the result matrix C with a new process. But for the 2000x2000-example, this would mean we started 2000 processes. The overhead is much worse than the benefit:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>python ikjMultiplication.py -i 2000.in &gt; 2000-parallel.out real 20m47.693s user 40m34.460s sys 0m2.092s </code></pre></div> <p>When we share memory, the code looks like this:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">multiprocessing</span><span class="o">,</span> <span class="nn">numpy</span><span class="o">,</span> <span class="nn">ctypes</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">lineMult</span><span class="p">(</span><span class="n">start</span><span class="p">):</span> <span class="k">global</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">mp_arr</span><span class="p">,</span> <span class="n">part</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="c"># create a new numpy array using the same memory as mp_arr</span> <span class="n">arr</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">mp_arr</span><span class="o">.</span><span class="n">get_obj</span><span class="p">(),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_int</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">arr</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">start</span><span class="o">+</span><span class="n">part</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">def</span> <span class="nf">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">threadNumber</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">pool</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Pool</span><span class="p">(</span><span class="n">threadNumber</span><span class="p">)</span> <span class="n">pool</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">lineMult</span><span class="p">,</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">,</span> <span class="n">part</span><span class="p">))</span> <span class="c"># mp_arr and arr share the same memory</span> <span class="n">arr</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">mp_arr</span><span class="o">.</span><span class="n">get_obj</span><span class="p">(),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_int</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">arr</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">))</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">extant_file</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> &#39;Type&#39; for argparse - checks that file exists but does not open.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isfile</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">raise</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentError</span><span class="p">(</span><span class="s">&quot;{0} does not exist&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">argparse</span><span class="o">,</span> <span class="nn">sys</span> <span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">isfile</span> <span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;ikjMatrix multiplication&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="s">&quot;--input&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">extant_file</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-o&quot;</span><span class="p">,</span> <span class="s">&quot;--output&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s">&#39;w&#39;</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;output&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;file to write output to (default=stdout)&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">B</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">threadNumber</span> <span class="o">=</span> <span class="mi">2</span> <span class="n">part</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">/</span> <span class="n">threadNumber</span> <span class="k">if</span> <span class="n">part</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span> <span class="n">part</span> <span class="o">=</span> <span class="mi">1</span> <span class="c"># shared, can be used from multiple processes</span> <span class="n">mp_arr</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Array</span><span class="p">(</span><span class="n">ctypes</span><span class="o">.</span><span class="n">c_int</span><span class="p">,</span> <span class="n">n</span><span class="o">*</span><span class="n">p</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">threadNumber</span><span class="p">)</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">output</span><span class="p">)</span> </code></pre></div> <p>and it needs MUCH more time:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>python ikjMultiplication-shared.py -i 2000.in &gt; 2000-parallel-2threads.out real 131m35.433s user 250m36.820s sys 0m9.533s </code></pre></div> <p>When we don&#39;t use shared memory, things run faster:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">multiprocessing</span><span class="o">,</span> <span class="nn">numpy</span><span class="o">,</span> <span class="nn">ctypes</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">lineMult</span><span class="p">(</span><span class="n">start</span><span class="p">):</span> <span class="k">global</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">part</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">start</span><span class="o">+</span><span class="n">part</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">def</span> <span class="nf">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">threadNumber</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">pool</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Pool</span><span class="p">(</span><span class="n">threadNumber</span><span class="p">)</span> <span class="n">pool</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">lineMult</span><span class="p">,</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">,</span> <span class="n">part</span><span class="p">))</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">extant_file</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> &#39;Type&#39; for argparse - checks that file exists but does not open.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isfile</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">raise</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentError</span><span class="p">(</span><span class="s">&quot;{0} does not exist&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">argparse</span><span class="o">,</span> <span class="nn">sys</span> <span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">isfile</span> <span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;ikjMatrix multiplication&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="s">&quot;--input&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">extant_file</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-o&quot;</span><span class="p">,</span> <span class="s">&quot;--output&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">FileType</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s">&#39;w&#39;</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;output&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;file to write output to (default=stdout)&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">B</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">threadNumber</span> <span class="o">=</span> <span class="mi">2</span> <span class="n">part</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">/</span> <span class="n">threadNumber</span> <span class="k">if</span> <span class="n">part</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span> <span class="n">part</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="n">C</span> <span class="o">=</span> <span class="n">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">threadNumber</span><span class="p">)</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">output</span><span class="p">)</span> </code></pre></div> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>python ikjMultiplication.py -i 2000.in &gt; 2000-parallel-4threads.out real 22m46.066s user 41m42.396s sys 0m2.324s </code></pre></div> <h2>Java</h2> <p>Shell.java:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.io.BufferedReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.FileReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.Callable</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutionException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.ExecutorService</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.Executors</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.Future</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Shell</span> <span class="o">{</span> <span class="kd">static</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="nf">read</span><span class="o">(</span><span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;();</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;();</span> <span class="n">String</span> <span class="n">thisLine</span><span class="o">;</span> <span class="k">try</span> <span class="o">{</span> <span class="n">BufferedReader</span> <span class="n">br</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BufferedReader</span><span class="o">(</span><span class="k">new</span> <span class="n">FileReader</span><span class="o">(</span><span class="n">filename</span><span class="o">));</span> <span class="c1">// Begin reading A</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">thisLine</span><span class="o">.</span><span class="na">trim</span><span class="o">().</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;&quot;</span><span class="o">))</span> <span class="o">{</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">A</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="c1">// Begin reading B</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">B</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="n">br</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Error: &quot;</span> <span class="o">+</span> <span class="n">e</span><span class="o">);</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="n">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;();</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">A</span><span class="o">);</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">B</span><span class="o">);</span> <span class="k">return</span> <span class="n">res</span><span class="o">;</span> <span class="o">}</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">printMatrix</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">matrix</span><span class="o">)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">line</span> <span class="o">:</span> <span class="n">matrix</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">StringBuilder</span> <span class="n">sb</span> <span class="o">=</span> <span class="k">new</span> <span class="n">StringBuilder</span><span class="o">(</span><span class="n">matrix</span><span class="o">.</span><span class="na">length</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">number</span> <span class="o">:</span> <span class="n">line</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">i</span><span class="o">++;</span> <span class="o">}</span> <span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">number</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">sb</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">parallelMult</span><span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span><span class="o">,</span> <span class="kt">int</span> <span class="n">threadNumber</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">()][</span><span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">size</span><span class="o">()];</span> <span class="n">ExecutorService</span> <span class="n">executor</span> <span class="o">=</span> <span class="n">Executors</span><span class="o">.</span><span class="na">newFixedThreadPool</span><span class="o">(</span><span class="n">threadNumber</span><span class="o">);</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;&gt;</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;&gt;();</span> <span class="kt">int</span> <span class="n">part</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">/</span> <span class="n">threadNumber</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">part</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span> <span class="n">part</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="o">}</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">part</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">i</span><span class="o">);</span> <span class="n">Callable</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;</span> <span class="n">worker</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineMultiplier</span><span class="o">(</span><span class="n">A</span><span class="o">,</span> <span class="n">B</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">i</span><span class="o">+</span><span class="n">part</span><span class="o">);</span> <span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;</span> <span class="n">submit</span> <span class="o">=</span> <span class="n">executor</span><span class="o">.</span><span class="na">submit</span><span class="o">(</span><span class="n">worker</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">submit</span><span class="o">);</span> <span class="o">}</span> <span class="c1">// now retrieve the result</span> <span class="kt">int</span> <span class="n">start</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="kt">int</span> <span class="n">CF</span><span class="o">[][];</span> <span class="k">for</span> <span class="o">(</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;</span> <span class="n">future</span> <span class="o">:</span> <span class="n">list</span><span class="o">)</span> <span class="o">{</span> <span class="k">try</span> <span class="o">{</span> <span class="n">CF</span> <span class="o">=</span> <span class="n">future</span><span class="o">.</span><span class="na">get</span><span class="o">();</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="n">start</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">start</span><span class="o">+</span><span class="n">part</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">CF</span><span class="o">[</span><span class="n">i</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">ExecutionException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="n">start</span><span class="o">+=</span><span class="n">part</span><span class="o">;</span> <span class="o">}</span> <span class="n">executor</span><span class="o">.</span><span class="na">shutdown</span><span class="o">();</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">String</span> <span class="n">filename</span><span class="o">;</span> <span class="kt">int</span> <span class="n">cores</span> <span class="o">=</span> <span class="n">Runtime</span><span class="o">.</span><span class="na">getRuntime</span><span class="o">().</span><span class="na">availableProcessors</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Number of cores:\t&quot;</span> <span class="o">+</span> <span class="n">cores</span><span class="o">);</span> <span class="kt">int</span> <span class="n">threads</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="o">)</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;3.in&quot;</span><span class="o">;</span> <span class="n">threads</span> <span class="o">=</span> <span class="n">cores</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">args</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span> <span class="n">threads</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">2</span><span class="o">]);</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="n">matrices</span> <span class="o">=</span> <span class="n">read</span><span class="o">(</span><span class="n">filename</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="n">parallelMult</span><span class="o">(</span><span class="n">A</span><span class="o">,</span> <span class="n">B</span><span class="o">,</span> <span class="n">threads</span><span class="o">);</span> <span class="n">printMatrix</span><span class="o">(</span><span class="n">C</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>LineMultiplier.java:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.concurrent.Callable</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">LineMultiplier</span> <span class="kd">implements</span> <span class="n">Callable</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">[][]&gt;</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span><span class="o">;</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span><span class="o">;</span> <span class="kt">int</span> <span class="n">start</span><span class="o">;</span> <span class="kt">int</span> <span class="n">end</span><span class="o">;</span> <span class="kd">public</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">LineMultiplier</span><span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">,</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">b</span><span class="o">,</span> <span class="kt">int</span> <span class="n">s</span><span class="o">,</span> <span class="kt">int</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">A</span> <span class="o">=</span> <span class="n">a</span><span class="o">;</span> <span class="n">B</span> <span class="o">=</span> <span class="n">b</span><span class="o">;</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">a</span><span class="o">.</span><span class="na">size</span><span class="o">()][</span><span class="n">b</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">size</span><span class="o">()];</span> <span class="n">start</span> <span class="o">=</span> <span class="n">s</span><span class="o">;</span> <span class="n">end</span> <span class="o">=</span> <span class="n">e</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">call</span><span class="o">()</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">start</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">end</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">B</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">k</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">size</span><span class="o">();</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+=</span> <span class="n">A</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">)</span> <span class="o">*</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Execute it with only one thread:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>java Shell -i 2000.in 1 &gt; 2000-paralllel.out Number of cores: 2 0 real 0m40.571s user 0m42.259s sys 0m0.388s </code></pre></div> <p>Execute it with two threads:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>java Shell -i 2000.in 2 &gt; 2000-paralllel.out Number of cores: 2 0 1000 real 0m30.188s user 0m54.999s sys 0m0.512s </code></pre></div> <p>Note that real time is lower than user time. The reason is simply that the execution time on each processor is added. So user time might be double as high as real time!</p> <p>We got from 40.571s down to 0m30.188s!</p> <h3>Information for parallelism</h3> <ul> <li><a href="http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html">Thread pools</a></li> <li><a href="http://www.ibm.com/developerworks/library/j-jtp0730/index.html">Java theory and practice: Thread pools and work queues</a></li> <li><a href="http://stackoverflow.com/questions/tagged/java+parallel-processing">StackOverflow</a></li> </ul> <h2>C++</h2> <p>Making the ikj-algorithm parallel is trivial with C++. You only need to add <code>#pragma omp parallel for</code> before the outer most for loop and add <code>-fopenmp</code> as a compile flag! (If you really want to see the code, go to <a href="https://github.com/MartinThoma/matrix-multiplication/tree/master/C%2B%2B/Parallel">my Git repository</a>.)</p> <div class="highlight"><pre><code class="bash"><span class="nv">$ </span><span class="nb">time</span> ./ikj-algorithm.out 2 2000.in &gt; 2000-parallel.out real 0m12.563s user 0m20.569s sys 0m0.156s </code></pre></div> <p>So we got from 20.407 seconds down to 12.563 seconds by adding only one line!</p> <h3>More Information</h3> <ul> <li><a href="http://bisqwit.iki.fi/story/howto/openmp/">Guide into OpenMP: Easy multithreading programming for C++</a></li> </ul> Part IV: How to multiply matrix with its transpose in Python and C++ http://martin-thoma.com/part-iv-multiply-matrix-transpose-python-cpp Fri, 18 Oct 2013 15:41:13 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/part-iv-multiply-matrix-transpose-python-cpp <div class="info">This is Part IV of my matrix multiplication series. Part I was about simple implementations and libraries: <a href="../matrix-multiplication-python-java-cpp/">Performance of Matrix multiplication in Python, Java and C++</a>, Part II was about multiplication with the <a href="../strassen-algorithm-in-python-java-cpp/" title="Part II: The Strassen algorithm in Python, Java and C++">Strassen algorithm</a> and Part III will be about parallel matrix multiplication (I didn't write it yet).</div> <p>You can always multiply a matrix <code>$J \in \mathbb{R}^{n \times m}$</code> with its transpose <code>$J^T$</code>, because <code>$J^T \in \mathbb{R}^{m \times n}$</code>. You will get a matrix <code>$C \in \mathbb{R}^{n \times n}$</code>.</p> <p>Standard matrix multiplication of square matrices <code>$\in \mathbb{R}^{n \times n}$</code> is in <code>$\mathcal{O}(n^3)$</code>. With the Strassen algorithm you can multiply in <code>$\approx \cal O(n^{2.807})$</code>. But this is for general matrix multiplication. When we do <code>$J \cdot J^T$</code> we have more structure, so it might be possible to do this multiplication faster.</p> <p>One important property of the result matrix <code>$R = J \cdot J^T$</code> is symmetry. So <code>$R_{i,j} = R_{j,i}$</code>. If we used the ikj-algorithm for this multiplication, we needed <code>$n^2 \cdot m$</code> operations. This way, we only need <code>$\frac{n^2 +n}{2} \cdot m$</code> operations. Yes, I know, asymptotically it is irrelevant. But skipping almost half of the operations is still quite good.</p> <h2>Python</h2> <h3>NumPy</h3> <p>I guess doing this with NumPy is the best option:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;2000.in&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">J</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="n">J</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">J</span><span class="p">)</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="n">J</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">R</span> <span class="o">=</span> <span class="n">J</span> <span class="o">*</span> <span class="n">J</span><span class="o">.</span><span class="n">T</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">)</span> </code></pre></div> <p>Time:</p> <div class="highlight"><pre><code class="bash">real 7m19.223s user 7m12.147s sys 0m2.388s </code></pre></div> <p>When you want to do this in an application, you might want to use <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html">numpy.load</a>.</p> <h2>C++</h2> <h3>First try</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;sstream&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;fstream&gt;</span> <span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;algorithm&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">getMatrixN</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">inFile</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">count</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">istreambuf_iterator</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span><span class="p">(</span><span class="n">inFile</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">istreambuf_iterator</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span><span class="p">(),</span> <span class="sc">&#39;\n&#39;</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">getMatrixM</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">ifstream</span> <span class="n">infile</span><span class="p">;</span> <span class="n">infile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span> <span class="k">return</span> <span class="n">count</span><span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">line</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="sc">&#39;\t&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">read</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">)</span> <span class="p">{</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">matrixfile</span> <span class="o">=</span> <span class="n">freopen</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="s">&quot;r&quot;</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span> <span class="kt">double</span> <span class="n">a</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">line</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">fclose</span> <span class="p">(</span><span class="n">matrixfile</span><span class="p">);</span> <span class="p">}</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">ikjalgorithmTranspose</span><span class="p">(</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">J</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">T</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">R</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">R</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">J</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">T</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">i</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">R</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">R</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">R</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">transpose</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">B</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">matrix</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">matrix</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">string</span> <span class="n">filename</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;../Testing/5161x7058.in&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">getMatrixN</span><span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">getMatrixM</span><span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">inner</span> <span class="p">(</span><span class="n">m</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">inner2</span> <span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">J</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">inner</span><span class="p">),</span> <span class="n">T</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">inner2</span><span class="p">),</span> <span class="n">R</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">inner</span><span class="p">);</span> <span class="n">read</span> <span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">J</span><span class="p">);</span> <span class="n">transpose</span><span class="p">(</span><span class="n">J</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span> <span class="n">ikjalgorithmTranspose</span><span class="p">(</span><span class="n">J</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Time:</p> <div class="highlight"><pre><code class="bash">real 5m31.488s user 5m27.560s sys 0m1.812s </code></pre></div> <h3>Direct multiplication</h3> <p>One might think that transposing first is a bad idea, because you can do this:</p> <div class="highlight"><pre><code class="cpp"><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">ikjDirect</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">J</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">R</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="k">register</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">R</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">J</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">J</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">R</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>I stopped execution after 15 minutes.</p> How to install Arch Linux 2013.10.01 http://martin-thoma.com/install-arch-linux-2013-10-01 Mon, 07 Oct 2013 01:19:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/install-arch-linux-2013-10-01 <p>I&#39;ve watched the following video which explains pretty much everything there is to know:</p> <iframe width="512" height="288" src="http://www.youtube.com/embed/BMgGUBDxCjo" frameborder="0" allowfullscreen></iframe> <p>You might also want to read the <a href="https://wiki.archlinux.org/index.php/Installation_Guide">Arch Linux Installation Guide</a>. The <a href="https://wiki.archlinux.de/title/Anleitung_f&uuml;r_Einsteiger">German guide</a> is also very good.</p> <p>I just like to add some notes. They are primarily for myself, so you really should read the installation guide or watch the video.</p> <p>The Arch Linux installation setup is command line based.</p> <h2>Keyboard layout</h2> <p>You can switch to a German keyboard layout with this command:</p> <div class="highlight"><pre><code class="bash">loadkeys de </code></pre></div> <h2>Partitioning and mounting</h2> <p>You need a bootable partition and a swap partition (that is at least as big as much RAM you have). Partitioning can be done with <code>cfdisk</code> (configure disk).</p> <p>Check the result with</p> <div class="highlight"><pre><code class="bash">parted /dev/sda print fdisk -l </code></pre></div> <p>Afterwards:</p> <div class="highlight"><pre><code class="bash">mkfs.ext4 /dev/sda1 mkfs.ext4 /dev/sda3 mkswap /dev/sda2 swapon /dev/sda2 mount /dev/sda1 /mnt mkdir /mnt/home mount /dev/sda3 /mnt/home/ </code></pre></div> <h2>Getting internet</h2> <p>I only have WLAN at the moment, which makes things more difficult:</p> <div class="highlight"><pre><code class="bash">wpa_passphrase <span class="s2">&quot;SSID&quot;</span> PASSWORD &gt; /etc/wpa_supplicant/wpa_supplicant.conf wpa_supplicant -i wlp4so -D wext -c /etc/wpa_supplicant/wpa_supplicant.conf -B dhcpcd wlp4s0 </code></pre></div> <p>wlp4s0 is the wlan interface (which is wlan0 most of the time). You get it with <code>ip link</code>.</p> <p>I had a lot of fun at this point as you can see <a href="http://unix.stackexchange.com/questions/93851/can-i-connet-to-internet-with-one-pc-and-give-over-lan-switch-internet-to-othe">here</a>.</p> <h2>Install base system</h2> <div class="highlight"><pre><code class="bash">packstrap -i /mnt base base base-devel </code></pre></div> <p>After accepting all defaults (by pressing enter) and letting it download:</p> <div class="highlight"><pre><code class="bash">genfstab -U -p /mnt : sed <span class="s1">&#39;s/rw,realtime,data=ordered/defaults,realtime/&#39;</span> &gt;&gt; /mnt/etc/fstab arch-chroot /mnt nano /etc/locale.gen </code></pre></div> <p>Uncomment your language (from now on, your promt should be &quot;sh-4.2#&quot;).</p> <div class="highlight"><pre><code class="bash"><span class="nv">locale</span><span class="o">=</span>gen <span class="nb">echo </span><span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 &gt; /etc/locale.conf <span class="nb">export </span><span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8 ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime hwclock --systohc --utc systemctl <span class="nb">enable </span>dhcpcd.service </code></pre></div> <p>Now edit and uncomment multilib. Then:</p> <div class="highlight"><pre><code class="bash">mkinitcpio -p linux </code></pre></div> <p>Now set the password by entering <code>passwd</code>. Create your user:</p> <div class="highlight"><pre><code class="bash">useradd -m -g users -G wheel -s /bin/bash moose passwd moose </code></pre></div> <p>Synchronise caches:</p> <div class="highlight"><pre><code class="bash">pacman -Syy </code></pre></div> <p>Install grub:</p> <div class="highlight"><pre><code class="bash">pacman -S grub-bios pacman -S os-prober grub-install /dev/sda grub-mkconfig -o /boot/grub/grub.cfg <span class="nb">exit</span> restart </code></pre></div> <p>Give yourself sudo:</p> <div class="highlight"><pre><code class="bash">pacman -S sudo nano /etc/sudoers </code></pre></div> <p>Add your user to the bottom section &quot;User privilege specification&quot;</p> <h2>Install GNOME</h2> <div class="highlight"><pre><code class="bash">pacman -S gnome xorg systemctl <span class="nb">enable </span>gdm.service </code></pre></div> <h2>MATE</h2> <p>Add the following to your /etc/pacman.conf:</p> <div class="highlight"><pre><code class="text">[mate] SigLevel = Optional TrustAll Server = http://repo.mate-desktop.org/archlinux/$arch </code></pre></div> <p>Run</p> <div class="highlight"><pre><code class="bash"><span class="c"># pacman -Syy</span> <span class="c"># pacman -S mate mate-extras</span> </code></pre></div> <p>Lets see if I get an answer to <a href="https://bbs.archlinux.org/viewtopic.php?id=170911">some essential basic questions</a>.</p> Projects I never realized http://martin-thoma.com/projects-never-realized Tue, 01 Oct 2013 21:41:37 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/projects-never-realized <p>The following is a collection of ideas for projects I had, but never realized. I would really love to do them, but they seem to be a little bit too time consuming to do them in my free time. Please send me an Email if you would like to realize them!</p> <h2>Book portal</h2> <p>I really miss a book recommendation portal. It should allow you to mark books you&#39;ve read or started to read, let you rate and tag books. The tags should be created by users, similar to the system StackExchange uses. Tags might be funny&quot;, &quot;zombie&quot;, &quot;magic&quot;, &quot;romance&quot;, &quot;love&quot;, ... and users should rate for tags for books. In some general settings you define language(s) you know. Every book, which should be administrated by ISBN number if possible, should have information about the language. The portal should also see when books are only released with a new cover / collectors edition and notice that its the same story.</p> <p>With this information, it should recommend books and allow you to search books.</p> <p>Eventually you could connect to friends and let their ratings influence what you get.</p> <p>And, very important, it should let you follow series and/or authors. So you should be able to say &quot;When there is a new book of the &#39;Harry Potter&#39; series, send me an email!&quot; or &quot;When there is a new book of the &#39;Harry Potter&#39; series translated to &#39;German&#39;, send me an email!&quot;.</p> <h2>Science and Education Platform</h2> <p>Sometimes, scientists get new insights that are able to influence millions. But until such a great invention or discovery is made, hundreds or thousands of people might have thought about the same problem. Today, with <abbr title="Massive open online courses"><a href="https://en.wikipedia.org/wiki/Massive_open_online_course">MOOCs</a></abbr> education in some fields is quite open to a lot of people. <a href="https://www.khanacademy.org/">Khan academy</a> offers many very basic courses, <a href="https://www.coursera.org/">Coursea</a> and <a href="https://www.udacity.com">Udacity</a> a few advanced ones. But the process of creating new content seems to be quite closed. <a href="https://en.wikiversity.org">Wikiversity</a> is more open, but very limited. For example, I think it is not possible to include <a href="../html5/graphic-filters/graphic-filters.htm">my graphic filter examples</a>. And it is not possible to track progress of students.</p> <p>I think it is necessary to gamify this. Both, students and educators, should get rewards. They might be only digital, but a student who can see the progress he makes might be much more interested in continuing a course. A teacher who can see the influence he has, who can see how students learn and where problems are might be much better able to improve his content and be motivated to do so. </p> <p>Also, scientists should not have to worry about presenting their studies. A lot of people know how to create graphics, some people know better about (the English) language and others are experts in LaTeX. If people were able to create requests online, get rewards for helping others and provide rewards to show that they really need help, I guess much better research could be made. Of course, this should be open.</p> <p>For every unit / paper, there should be definitions what is necessary to know. The topics should automatically be linked to content that provides the knowledge.</p> <p>It is very complex to plan such a system, because education in different languages / nations might be very different and ideas how to educate vary a lot. Even subtasks (creating a LaTeX editor, a graph that shows influence of papers / books by citation, creating an image editor, creating a reward system) are very difficult. And everything has to scale for millions of users. This means you would have to plan quite a lot before you could even think about implementation. For this project, you would need: <ul> <li>Somebody, who has experience with online courses.</li> <li>A teacher for children.</li> <li>A teacher for teenagers.</li> <li>A teacher for students.</li> <li>Somebody, who has experience with gamification.</li> <li>Somebody, who has contacts to politics and knows how to advertise.</li> </ul></p> <h2>Wikipedia KI</h2> <p>Try to categorize images in <a href="https://en.wikipedia.org/wiki/Category:Uncategorized_images">Category:Uncategorized images</a> or find images that have the wrong category / missing categories.</p> <h2>Translations</h2> <p>I did some translation work some years ago for <a href="http://www.nongnu.org/lordsawar/">LordsAWar</a>. From a software point of view, this was a pain in the ass. Rosetta (part of Launchpad, for Ubuntu) is much better.</p> <p>Another idea that is much better is <a href="http://www.duolingo.com/">Duolingo</a>.</p> <h2>Distributed, Universal Tagging System</h2> <h3>Tagging</h3> <p>Most information can be displayed rather simple. A string that describes the kind of information and a bool / int / float / string / BLOB for the information itself and an identifier.</p> <p>For example, you can describe a product with the following labels: <ul> <li>Identifier: &quot;898a4c822ffc456fa7a417e500b2c05a&quot;</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;ISBN-10&quot;: &quot;0141439513&quot; (string)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;ISBN-13&quot;: &quot;978-0141439518&quot; (string)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;Pages&quot;: 480 (int)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;Publisher&quot;: &quot;Penguin Classics&quot; (string)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;Category&quot;: &quot;Book&quot; (string)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;Category&quot;: &quot;Literature&quot; (string)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;Category&quot;: ed054753e4b240a8aa1322ad348bf728 (identifier)</li> <li>&quot;898a4c822ffc456fa7a417e500b2c05a&quot;, &quot;VIEW&quot;: 0839c5beac414fb19c400b6ca0372388 (identifier)</li> <li>Identifier: &quot;ed054753e4b240a8aa1322ad348bf728&quot;</li> <li>&quot;ed054753e4b240a8aa1322ad348bf728&quot;, &quot;Name&quot;: &quot;Literature&quot;</li> <li>&quot;ed054753e4b240a8aa1322ad348bf728&quot;, &quot;Category&quot;: &quot;Books&quot;</li> </ul></p> <p>As you can see, it is possible to create nested categories with this structure. You an also create lists this way.</p> <p>Now clients should store information like this and share it. </p> <h3>Views</h3> <p>When information is presented like this, it is quite useless. But what about this kind of presentation:</p> <div style="width: 267px" class="wp-caption aligncenter"><a href="../images/2013/10/pride-and-prejudice-infobox.png"><img src="../images/2013/10/pride-and-prejudice-infobox.png" alt="" width="267" height="549" class="size-full wp-image-76576"/></a><p class="wp-caption-text"></p></div> <p>Or, for example <a href="http://ark.intel.com/compare/75133,50176">ark.intel.com</a>:</p> <div style="width: 643px" class="wp-caption aligncenter"><a href="../images/2013/10/intel-ark-compare.png"><img src="../images/2013/10/intel-ark-compare.png" alt="" width="643" height="591" class="size-full wp-image-76577"/></a><p class="wp-caption-text"></p></div> <p>So another required feature of such a client are &quot;views&quot;. A view is defined by an identifier (so that you can tag views just like any other object) and an HTML template. Objects could have labels called &quot;VIEW&quot; with type identifier that tell the client which view should be added.</p> <h3>Distribution</h3> <p>There are plenty of cool tools out there (Amazon recommendations, <a href="http://ark.intel.com/">ark.intel.com</a> to compare Intel processors, <a href="http://de.blackberry.com/smartphones/compare.html">blackberry</a> allows you to compare their phones, Wikipedia info boxes, ...). But most of them are very ristricted. For example, the way I compare smartphones is not fundamentally different from the way I compare processors. Yes, the attributes differ. But basically it is creating a table with all the information. Also, Intel does not provide information about AMD processors.</p> <p>So we need a way to get and share information. XML is the way-to-go for centralized computer systems. Maybe they can also be used to realize what I&#39;m thinking about. But I think a problem that has to be solved is that we don&#39;t have a single source for all information that we trust in. We have networks of trust. When Intel says A and a friend says B about an Intel processor, I guess I will rather believe A. But when Intel does not provide some information about a processor and a friend says B, but a person I don&#39;t know says C, I&#39;ll believe B. But when thousands of people say C and my friend says B, I might rather believe C.</p> <p>It&#39;s getting complicated, right? Maybe the processor example is not good, as there is much information and information is either right or wrong. But lets say we talk about genre of movies. This might be much more difficult as there is no &quot;definitely right&quot; or &quot;definitely wrong&quot;. Multiple answers might be right. </p> <p>So every information has also have to carry information about who thinks it is right. And you have to be able to define networks you trust in. Perhaps you could create &quot;people objects&quot; that can also be labeled. &quot;Your&quot; object had to be protected so that only you could add &quot;friend of&quot; labels or &quot;I trust&quot; labels or something like this.</p> <h2>Chrome</h2> <p>I had some <a href="../how-chrome-could-be-improved-2nd-post/">ideas how to improve Chrome</a>.</p> <h2>MATE</h2> <p>After the changes in desktop environments, <a href="https://en.wikipedia.org/wiki/MATE_(software)">MATE</a> got my favorite desktop environment. Although I was more happy with GNOME 2.6.</p> <ul> <li>Adding the drag-and-drop effect that creates a new window from an tab, known from Chrome, to Terminal and Pluma (gEdit).</li> <li>Creating a LaTeX plugin for Pluma that auto-completes the environments.</li> </ul> <h2>LaTeX Tools</h2> <p>I would like to create online tools (pure HTML/CSS/JavaScript) that make the following tasks simpler. <ul> <li>A table editor. I know <a href="http://truben.no/latex/table/">Trubens table tool</a>, but this tool does not allow to combine cells. Also, the site is down quite often.</li> <li>A Ti<em>k</em>Z editor.</li> <li>An editor for bibliography.</li> <li>A LaTeX source code beautifier.</li> <li>A LaTeX-aware spell checker. This spell checker could probably use aspell, but it would have to filter LaTeX code.</li> </ul></p> <p>Also, I would like to create an app that helps users to create formulas. This app should run on smartphones and on tablets. I don&#39;t think that this can be done with pure JavaScript.</p> <h2>Open Hardware</h2> <p>I&#39;m fascinated by the idea of open hardware. That means that you publish plans of something and maybe also how to create it. Although I don&#39;t have any experience in this field, I can think of some interesting projects. One way to support open hardware would be to create an education and science platform, like the one I&#39;ve described above.</p> <h3>Open Internet</h3> <p>I guess most smartphone users know this situation: You go to a friend / on vacation and you don&#39;t have WLAN. This means you have to use mobile internet, which is expensive. If you&#39;re in an area where not many people live, it is ok. If you&#39;re in a big city, it is not. There are so many people who have an internet connection and a router which already establishes a WLAN. You can see them, but not use the connection! What a shame!</p> <p>What we would need is a device with the following attributes: <ul> <li>Simplicity <ul> <li>It has to be a <a href="https://en.wikipedia.org/wiki/DSL_modem">DSL modem</a> and a <a href="https://en.wikipedia.org/wiki/Router_(computing)">router</a> combined, eventually also a <a href="https://en.wikipedia.org/wiki/DSL_filter">DSL filter</a>.</li> <li>Everything has to be configurable via web interface. This interface has to be VERY GOOD.</li> <li>You should be able to get a backup file via web interface that contains every single configuration. This file should be an good documented XML file. The documentation should contain example data.</li> <li>Every setting should have its own url, just like in Google Chrome.</li> <li>As many self-tests that give meaningful messages as possible: <ul> <li>A LED that indicates if the device has power.</li> <li>Ethernet jack should glow if a device is connected and blink if data is send.</li> <li>A software test via web interface that checks if internet connection is available.</li> <li>Direct feedback when you enter wrong / malformed credentials.</li> </ul> </li> <li>A reset button that restores the software completely from non-erasable memory.</li> <li>Small memory and rechargeable battery that allows you to download router software updates when the battery is full.</li> <li>A user manual with pictures that explains what to do to get internet.</li> </ul> </li> <li>Functionality and requirements <ul> <li>It has to be able to create a WLAN.</li> <li>It has to be fast. I think currently 802.11n is with 450 Mbit/s the best you can get for WLAN and 1000 Mbit/s for Ethernet</li> <li>At least one Ethernet jack.</li> <li>It should be secure (WPA2, eventually don&#39;t support WEP and WPA).</li> <li>Reasonable energy consumption and no active fans.</li> <li>A standardized power supply unit that can be bought without buying a new device.</li> </ul> </li> <li>Box - how it looks <ul> <li>The case should be robust.</li> <li>You should be able to mount it to a wall or to lay it on the floor.</li> </ul> </li> </ul></p> <p>I don&#39;t think it is necessary to support VoIP, ISDN and Surf Sticks.</p> <p>Now the special part: It should allow you to create a WLAN that others can use by registering in a service. The device should guarantee that you get the bandwidth, in case you need it. But if you have free bandwidth, others should be able to use it. Of course, this function should also protect you from legal trouble. An essential problem is keeping you from legal trouble while making sure that nobody uses the system to betray external users. But when you solve this problem, I guess it would be quite easy to establish free WLAN in all bigger cities. A great chance for tourism and a backup-option for you when your internet connection breaks.</p> <p>The service should also allow the user to register the free WLAN online. An app should download these locations and be able to navigate a user to the next free WLAN.</p> <p>Ah and of course everything in there should be free. This piece of hardware is critical for your internet access. If you want to be sure that you don&#39;t get under surveillance by an attack on this piece of hardware, it would be good to know that some smart people had the possibility to check if everything is fine with this hardware.</p> <h3>Work computers</h3> <p>Today, we have a lot of computers that are used for very, very simple work. The most computing intensive part might be large Excel sheets. So basically, they don&#39;t need any improvements in hardware for years. But the few things they do, need to be done well. Security is important. It is also important that things are stable and don&#39;t change a lot. And what they do should be fast. Loading times are almost not acceptable.</p> <p>I guess many tasks could be done within a browser. So work that needs heavy computation can be done on a stronger machine (the cloud - not necessarily outside of the company).</p> <p>Why hasn&#39;t any big company like <a href="https://en.wikipedia.org/wiki/General_motors">General Motors</a>, <a href="https://en.wikipedia.org/wiki/General_Electric">General Electric</a>, <a href="https://en.wikipedia.org/wiki/Walmart">Wallmart</a> or even countries that have thousands of schools and government employees tried to create such a computer that is really reliable, robust and cheap (energy and because it can be produced it can be produced in very big numbers)?</p> <p>Here is what I think should be ok: <ul> <li>processor with low power consumption (700 MHz or more)</li> <li>2 GB of RAM (I guess you might now think of this <a href="https://en.wikiquote.org/wiki/Bill_Gates#Misattributed">missatributed Bill Gates quote</a> ... but with <code>cat /proc/meminfo</code> you can see how much you currently use).</li> <li>30 GB SSD: Important information should be stored on a computer that is protected very well against data loss. A SSD is silent and can read content very fast. Ideally, only the <abbr title="operating system">OS</abbr> is stored on the employees computer.</li> <li>VERY silent fan, if possible non at all.</li> <li>Big monitor with high resolution, because those people have to work all day with the computer and low quality speakers.</li> <li>Good and silent keyboards (like the <a href="http://codekeyboards.com/">CODE keyboard</a>).</li> <li>Network card.</li> <li>Graphic card that allows the high resolution display.</li> </ul></p> <p>This is just a quick thought. I think such a system should contain some reference software that has to run fluidly. The software should also be open, of course. I think the following should be enough:</p> <ul> <li>Linux based OS (e.g. <a href="https://en.wikipedia.org/wiki/Debian">Debian</a>)</li> <li>Basic command line tools (bash, grep, find, cat, vim)</li> <li>Desktop manager with classic desktop metaphor (e.g. <a href="https://en.wikipedia.org/wiki/MATE_(desktop_environment)">MATE</a>)</li> <li>File manager with access to a network drive (e.g. Caja or Nautilus)</li> <li>Modern Browser (Firefox or Chrome)</li> </ul> <p>Tasks that can (and should) be done via browser are: <ul> <li>Emails: e.g. <a href="https://en.wikipedia.org/wiki/Roundcube">Roundcube</a></li> <li>Excel: Hmmm ... I know that <a href="https://drive.google.com">Google Docs</a> offers some similar stuff. Bug I guess it can&#39;t replace Microsoft Excel by now. I don&#39;t know if there are any self-hosted services</li> <li>Word: e.g. <a href="http://etherpad.org/">Etherpad</a></li> <li>Outlook: e.g. <a href="http://owncloud.org/">OwnCloud</a></li> <li>LaTeX: e.g. <a href="https://github.com/alabid/flylatex">FlyLaTeX</a></li> <li>Geographic information systems: I don&#39;t know if there is software online. But I guess with OpenStreetMaps it should not be too difficult to create it. <a href="http://www.esri.com/software/arcgis/arcgisonline">ArcGis</a> seems to be one solution.</li> </ul></p> <p>Basically, you can do almost everything with a web application. So the client can get quite slim. But although you could probably do everything with a self hosted client/server solution, those solutions don&#39;t always exist yet.</p> <p>Tasks that should not be done via browser might be: <ul> <li>Professional video/audio editing: I guess you need more than one monitor to display all relevant information.</li> <li>Programming: Although I have seen <a href="https://c9.io/">Cloud9</a>, I doubt that programming in the cloud can be convenient in the next years. How does bug fixing work? How about manual testing? Whats with parallel execution?</li> <li>Messaging: If you want to use encrypted communication (e.g. Email with PGP) you should probably do the encryption on your machine.</li> </ul></p> <p>Hmmm ... astonishingly, I can currently not think of more tasks.</p> <h3>Not so smart phone</h3> <p>Do you remember the good old days when your cell phone wasn&#39;t essentially a small PC? I&#39;ve bought a smartphone a while ago (<a href="../nexus-4/">article</a>), but I still see reasons to have a cell phone: <ul> <li>Battery life: My Motorola W156 had a battery with only 940 mAh, but 465 hours stand-by time. If it had 3100 mAh as the <a href="https://en.wikipedia.org/wiki/Samsung_Galaxy_Note_II">Samsung Galaxy Note II</a>, it would have a standby time of 1534 hours! That are about 64 days!</li> <li>Security: Have you ever heard of somebody hacking a device that can only phone and send SMS?</li> <li>Cost: The Motorola W156 costs 25 Euro on Amazon.</li> <li>Robustness: A friend of mine put her <a href="https://en.wikipedia.org/wiki/Nokia_3310">Nokia 3310</a> accidentally in the washing machine. After that, she removed the battery, let it dry for a week, put the battery back. It worked. What the hell!?! (See also: <a href="http://weknowmemes.com/2012/02/our-love-is-forever-so-here-is-a-nokia/">Nokia is forever</a> and <a href="http://knowyourmeme.com/memes/indestructible-nokia-3310">Indestructible Nokia 3310 meme</a>)</li> <li>Size: Modern smartphones are a little bit uncomfortable to phone with. They are too big, although they are very thin. A size of 114 x 43 x 14 mm is fine, maybe a little bigger is also ok.</li> </ul></p> <p>The needed functionality is: <ul> <li>Phone with good quality</li> <li>Send SMS (and repetedly try to do so if no net is available)</li> <li>Store about 100 contacts</li> <li>Save about 100 SMS</li> <li>Load battery via micro USB (<a href="https://en.wikipedia.org/wiki/Common_External_Power_Supply">Common External Power Supply</a>)</li> <li>If not too complicated: Let me back up all data on the phone via this micro-USB slot and let me also restore such a backup</li> <li>3.5mm phone jack for using a headset</li> </ul></p> <p>What is not needed: <ul> <li>Camera, Flashlight</li> <li>Internet access, Bluethooth, NFC, ...</li> <li>Multi-colored display: B/W screen is just ok</li> <li>Fingerprint scanner</li> </ul></p> Bitcoin http://martin-thoma.com/bitcoin Wed, 11 Sep 2013 18:53:51 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/bitcoin <blockquote>Bitcoin [...] is a cryptographic currency where the creation and transfer of bitcoins is based on an open-source cryptographic protocol that is <strong>independent of any central authority</strong>. Bitcoins can be transferred through a computer or smartphone without an intermediate financial institution. The concept was introduced in a 2008 paper by a pseudonymous developer known only as "Satoshi Nakamoto", who called it a <strong>peer-to-peer, electronic cash system</strong>. The processing of Bitcoin transactions is secured by servers called bitcoin miners. These servers communicate over an internet-based network and confirm transactions by adding them to a ledger which is updated and archived periodically using peer-to-peer filesharing technology. In addition to archiving transactions, each new ledger update creates some newly minted bitcoins. The number of new bitcoins created in each update is halved every 4 years until the year <strong>2140</strong> when this number will round down to zero. At that time no more bitcoins will be added into circulation and the total number of bitcoins will have reached a <strong>maximum of 21 million bitcoins</strong>. To accommodate this limit, each bitcoin is subdivided down to eight decimal places; forming <strong>100 million smaller units</strong> called satoshis. In August 2013 Germany's Finance Ministry subsumed Bitcoins under the term "unit of account"&mdash;a financial instrument&mdash;though not as e-money or a functional currency. Although bitcoin is promoted as a digital currency, many commentators have criticized bitcoin's volatile exchange rate, relatively inflexible supply, high risk of loss, and minimal use in trade.</blockquote> <p>Source: <a href="https://en.wikipedia.org/w/index.php?title=Bitcoin&oldid=571455676">Wikipedia</a></p> <p>Sounds interesting, doesn&#39;t it? I&#39;d like to share my thoughts about some aspects of Bitcoin. Please note that I&#39;m neither an economics student, nor did I read the specifications of Bitcoin.</p> <h2>Security of Bitcoin</h2> <h3>Data loss</h3> <p>Once in a while, hard discs crash. If you&#39;re unlucky, you will lose all your data. This could mean you lose your Bitcoin wallet, so you lose your money. There is absolutely no way to get the money back. It&#39;s lost. Just like if you&#39;ve lost bank notes in a big city. You will never get it back (<a href="http://bitcoin.stackexchange.com/q/116/6721">source</a>).</p> <p>BUT, unlike with bank notes, nobody else will get it. These Bitcoins are lost and nobody can do anything against that. I think that means <strong>after 2140 the number of active Bitcons will drop</strong>! This is called a <a href="https://en.wikipedia.org/wiki/Deflation">deflation</a> with normal money. But as you can subdivide every bitcoin in as small pieces as you like, I&#39;m not sure what this means for economy.</p> <h3>Attacks</h3> <p>When money is involved, there will always be people who try to profit from that. So you have to think about security of Bitcoins.</p> <h4>System attacks</h4> <p>For me, a system attack is an attack where somebody tries to break the system. He does NOT want to profit from the system, but he wants to harm all people who use it.</p> <p>The only attack I&#39;ve found is a 51%-attack (<a href="https://en.bitcoin.it/wiki/Weaknesses#Attacker_has_a_lot_of_computing_power">source</a>). This means, in long term you have to have more than 50% of the computing power of the total bitcoin network. So if there is a dramatic change in computing power, this might make Bitcoin as a system insecure. Also, in short term with much luck you might also take down the network with less computing power (<a href="http://bitcoin.stackexchange.com/a/10937/6721">source</a>).</p> <p>But the more people participate, the more unlikely it gets. And this problem might our current system also have. If somebody manages to get MUCH more computing power, he could break encryption. This means, all bank transactions could at least be read by this attacker, if not manipulated.</p> <h4>Theft</h4> <p>Theft is possible by stealing your credentials. This can be done by infecting your computer with a virus, just like it can be done today with your bank account if you use online banking (or with the computers of banks, though that should be much more difficult).</p> <p>Also, the software you use for Bitcoin transactions might have errors.</p> <h2>Money laundering</h2> <p>It seems to be a big problem of Bitcoin that money laundering might be easy. You can&#39;t close a criminals account, you cannot stop criminals using Bitcoin for illegal operations.</p> <p>But what can you do with the current currency against that? Not much, when the money gets abroad.</p> <h2>Credits</h2> <p>You can&#39;t give credits as banks do it today with Bitcoin. If I understand it correctly, the &quot;Common Equity Capital Ratio&quot; has to be at least 3.5% in 2013 (<a href="https://en.wikipedia.org/wiki/Basel_III">source</a>). In other words: banks are allowed to give more than 27x the amount of money they actually have! Now I&#39;m very uncertain if I&#39;m here correct, but I think this was an important reason why the financial crisis happened. This would not have been possible with Bitcoin! With Bitcoin, you can only give credit for money you currently have. No cent ... uhmm ... Sotisho more than that.</p> <p>BUT: I really don&#39;t know if this would be better. I guess it would be extremely difficult for states to get money. There would be the need of heavy restructuring in how we finance our countries.</p> <h3>Interest</h3> <p>A problem with credits in the Bitcoin-system would be that it is very difficult to estimate what the result of the interest would be.</p> <p>As there are &quot;only&quot; 21 million Bitcoins, it would bet possible that the sum of all dept is more than available Bitcoins. Can it be legal to force people to pay when you know that at least one technically can&#39;t pay at the end? This problem seems not to exist in the current system, as they always print new money.</p> <h2>Wages</h2> <p>At the moment, employed people have to fight in unions for more money. They really need it, because inflation happens all the time. So just to keep the current situation, employees have to do something.</p> <p>With Bitcoin, the situation might change. As we produce more and more every year, a deflation would be likely. This means, bosses would have to cut loans to keep the situation the same. But it is much more difficult to change the bills you pay. People will not blindly accept less money on their accounts per month. Unlike today, when people are basically ok when they get a compensation for inflation.</p> <h2>See also</h2> <ul> <li><a href="https://www.bitcoin.de/de">Bitcoin.de</a>: You can see how much 1 Bitcoin is worth in Dollar / Euro.</li> <li>bitcoin.stackexchange.com: <ul> <li><a href="http://bitcoin.stackexchange.com/q/13215/6721">What can we do if Bitcoin is used as money laundering?</a></li> <li><a href="http://bitcoin.stackexchange.com/q/122/6721">Will we ever need smaller amounts of Bitcoin than a Satoshi?</a></li> </ul> </li> </ul> How to apply the Viterbi algorithm http://martin-thoma.com/apply-viterbi-aglrithm Wed, 11 Sep 2013 15:46:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/apply-viterbi-aglrithm <p>The goal of the Viterbi algorithm is find the most likely sequence of hidden states given some observed events.</p> <p>Lets say this is your <abbr title="Hidden Markov model">HMM</abbr>:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/09/hidden-markov-model-abc-2.png"><img src="../images/2013/09/hidden-markov-model-abc-2.png" alt="" width="512" height="252" class="size-full wp-image-76518"/></a><p class="wp-caption-text"></p></div> <p>We always start in <code>$x$</code> and always end in <code>$z$</code>.</p> <p>Now you observed the sequence <code>$O_1 = BAB$</code>. What is the most likely sequence that would generate this path?</p> <p>Candidates are: <ul> <li>xxyz</li> <li>xyyz</li> <li>xyzz</li> </ul></p> <p>If you&#39;re learing this because you will write the exam at KIT, you might have such an diagram:</p> <div style="width: 751px" class="wp-caption aligncenter"><a href="../images/2013/09/viterbi-algorithm.png"><img src="../images/2013/09/viterbi-algorithm.png" alt="" width="751" height="300" class="size-full wp-image-76520"/></a><p class="wp-caption-text"></p></div> <p>In this case, the bold path is the Viterbi path. You can see this when you get backwards from the last state:</p> <p><code>$\frac{1}{125} \cdot 1 \cdot 0.2 &gt; \frac{9}{2500} \cdot 0.8 \cdot 0.2$</code>. After this step, you only have one choice. So the Viterbi path is xyzz.</p> <p>Please note that there might be multiple paths with the highest possibility.</p> <p>As every state depends only on the state before, you can get the most likely path step by step. In every step, you calculate how likely it is that you end up in state x, state y, state z. After that, it doesn&#39;t matter how you got there. So you always have to expand those three nodes. You will get 9 following states, but only three of them matter (for each resulting state, the paths that had the highest probability leading there).</p> How do I calculate a Histogram equalization? http://martin-thoma.com/calculate-histogram-equalization Wed, 11 Sep 2013 11:17:39 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/calculate-histogram-equalization <p>Let&#39;s say you have the following greyscale image:</p> <p><code>$A = \begin{pmatrix} 255 &amp; 50 &amp; 255\\ 0 &amp; 50 &amp; 50 \end{pmatrix}$</code></p> <h2>Histogram</h2> <p>Now the histogram is a function <code>$H: [0,255] \rightarrow \mathbb{N}_0$</code>. </p> <p>The histogram of <code>$A$</code> is</p> <p><code>$H(x) := \begin{cases} 1 &amp;\text{, if } x = 0\\ 3 &amp;\text{, if } x = 50\\ 2 &amp;\text{, if } x = 255 \end{cases}$</code></p> <h2>Accumulated histogram</h2> <p>The accumulated histogram <code>$H_\alpha: [0,255] \rightarrow \mathbb{N}_0$</code> is defined as</p> <p><code>$H_\alpha(x) := \sum_{i=0}^x H(i)$</code></p> <p>This means, in the given example you get</p> <p><code>$H_\alpha(x) := \begin{cases} 1 &amp;\text{, if } x &lt; 50\\ 4 &amp;\text{, if } 50 \leq x &lt; 255\\ 6 &amp;\text{, if } x = 255 \end{cases}$</code></p> <h2>Normalized histogram</h2> <p>The normalized histogram is defined as <code>$H_n(x) := \mathrm{round}(\frac{255}{w \cdot h} \cdot H_\alpha(x))$</code> where <code>$w$</code> is the width of the image and <code>$h$</code> is the height of the image.</p> <p>In our example it&#39;s:</p> <p><code>$H_n(x) := \begin{cases} 43 &amp;\text{, if } x &lt; 50\\ 170 &amp;\text{, if } 50 \leq x &lt; 255\\ 255 &amp;\text{, if } x = 255 \end{cases}$</code></p> <p>So the resulting image is</p> <p><code>$A = \begin{pmatrix} 255 &amp; 170 &amp; 255\\ 43 &amp; 170 &amp; 170 \end{pmatrix}$</code></p> <h2>See also</h2> <ul> <li><a href="http://www.songho.ca/dsp/histogram/histogram.html">Some code</a></li> <li><a href="http://www.csce.uark.edu/~jgauch/5683/notes/ch03b.pdf">Code and examples</a></li> </ul> Calculations with quaternions http://martin-thoma.com/calculations-with-quaternions Mon, 09 Sep 2013 12:45:17 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/calculations-with-quaternions <p><a href="https://en.wikipedia.org/wiki/Quaternion">Quaternions</a> are an expansion of the concept of complex numbers on structures with four (instead of two) components. A quaterion <code>$h$</code> can be written as a vector or in the form of <code>$h = h_0 + ih_1 + j h_2 + kh_3$</code>, where <code>$i, j$</code> and <code>$k$</code> are related to the <code>$i$</code> in complex numbers. Accordingly <code>$h_0$</code> is often called real part and h<em>1, h</em>2, h_3 are called imaginary part of a quaternion. </p> <p>For <code>$i, j$</code> and <code>$k$</code> the following rules are applied:</p> <p><code>$i^2 = j^2 = k^2 = -1$</code> and <code>$ijk=-1$</code></p> <h2>Basic rules</h2> <p>From these rules follows: <code>$\begin{align} ij &amp;= k\\ ji &amp;= -k\\ jk &amp;= i\\ kj &amp;= -i\\ ki &amp;= j\\ ik &amp;= -j \end{align}$</code></p> <p>(<a href="http://math.stackexchange.com/q/487245/6876">proof</a>)</p> <h2>Multiplication</h2> <p>Now, obviously quaternions multiplication is not commutative: <code>$ij = k \neq -k = ji$</code></p> <p>But for numbers in <code>$\mathbb{R}$</code>, it is commutative (<a href="http://math.stackexchange.com/q/488271/6876">proof</a>).</p> <p>The multiplication is:</p> <p><code>$\begin{align} x y &amp;=( x_0 y_0 - x_1 y_1 - x_2 y_2 - x_3 y_3)\\ &amp;+( x_0 y_1 + x_1 y_0 + x_2 y_3 - x_3 y_2) \mathrm i\\ &amp;+( x_0 y_2 - x_1 y_3 + x_2 y_0 + x_3 y_1) \mathrm j\\ &amp;+( x_0 y_3 + x_1 y_2 - x_2 y_1 + x_3 y_0) \mathrm k \end{align}$</code></p> <h3>Calculating multiplicative inverse</h3> <p>This means, when you&#39;re given an element <code>$x = x_0 + x_1 \mathrm i + x_2 \mathrm j + x_3 \mathrm k$</code> its inverse <code>$y$</code> can be calculated by solving the following linear system of equations:</p> <p><code>$\begin{align} x_0 y_0 - x_1 y_1 - x_2 y_2 - x_3 y_3 &amp;= 1\\ x_0 y_1 + x_1 y_0 + x_2 y_3 - x_3 y_2 &amp;= 0\\ x_0 y_2 - x_1 y_3 + x_2 y_0 + x_3 y_1 &amp;= 0\\ x_0 y_3 + x_1 y_2 - x_2 y_1 + x_3 y_0 &amp;= 0\\ \end{align}$</code></p> <p>which can be written as:</p> <p><code>$\left(\begin{array}{cccc|c} x_0 &amp; -x_1 &amp; -x_2 &amp; -x_3 &amp; 1\\ x_1 &amp; x_0 &amp; -x_3 &amp; x_2 &amp; 0\\ x_2 &amp; x_3 &amp; x_0 &amp; -x_1 &amp; 0\\ x_3 &amp; -x_2 &amp; x_1 &amp; x_0 &amp; 0 \end{array}\right).$</code></p> <p>According to <a href="http://www.mathworks.de/de/help/aeroblks/quaternioninverse.html">mathworks</a> it is </p> <p><code>$y = \frac{x_0 - \mathrm i x_1 - \mathrm j x_2 - \mathrm k x_3}{x_0^2 + x_1^2 + x_2^2 + x_3^2}$</code></p> <h2>More</h2> <h3>Conjugate</h3> <p>Just like the complex conjugate is defined as</p> <p><code>$\overline{z} = a - ib$</code> with <code>$z=a+ib$</code></p> <p>the conjugate of quaternions is defined as</p> <p><code>$\bar x := x_0-x_1\mathrm i-x_2\mathrm j-x_3\mathrm k$</code> with <code>$x=x_0+x_1\mathrm i+x_2\mathrm j+x_3\mathrm k$</code></p> <h3>Rotating points</h3> <p>Quaternions can be used to rotate points. It works like this:</p> <p><code>$x&#39; = q x \overline{q}$</code></p> <p>Pretty simple, isn&#39;t it?</p> <p>For example, if you had the point (2,0,0) and you wanted to rotated it by <code>$q = (\frac{\sqrt{2}}{2}, 0, \frac{\sqrt{2}}{2}, 0)$</code> you would transform (2,0,0) to (2i+0k+0j) and calculate</p> <p><code>$\begin{align} x&#39; &amp;= q x \overline{q}\\ &amp;= (\frac{\sqrt{2}}{2}+\frac{\sqrt{2}}{2} \mathrm j) \cdot 2 \mathrm i \cdot (\frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2} \mathrm j)\\ &amp;= (\sqrt{2} \mathrm i + \sqrt{2} \mathrm{ji}) \cdot (\frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2} \mathrm j)\\ &amp;= (\sqrt{2} \mathrm i - \sqrt{2} \mathrm k) \cdot (\frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2} \mathrm j)\\ &amp;= \mathrm i - \mathrm{ij} - \mathrm k + \mathrm{kj}\\ &amp;= \mathrm{i - k -k - i}\\ &amp;= -2 \mathrm k\\ &amp;\Rightarrow x&#39; = (0,0,-2) \end{align}$</code></p> <h3>Rotation matrix to quaternion</h3> <p>Let <code>$M$</code> be a rotation matrix and <code>$m_{ij}$</code> be an entry of this matrix.</p> <h4>General rule</h4> <p>\begin{align} s &amp;= \frac{1}{2} \sqrt{1 + \sum<em>{i=1}^3 m</em>{ii}}\ x &amp;= \frac{m<em>{32} - m</em>{23}}{4s}\ y &amp;= \frac{m<em>{13} - m</em>{31}}{4s}\ z &amp;= \frac{m<em>{21} - m</em>{12}}{4s} \end{align}</p> <p>resulting in the quaternion <code>$(s, x, y, z)$</code>.</p> <h4>Special rule</h4> <p>A rotation matrix</p> <p><code>$R_y = \begin{pmatrix} \cos(\theta) &amp; 0 &amp; \sin(\theta)\\ 0 &amp; 1 &amp; 0\\ -\sin(\theta) &amp; 0 &amp; \cos(\theta) \end{pmatrix}$</code></p> <p>can be transformed to a quaternion</p> <p><code>$q = (\cos(\frac{\theta}{2}), \vec u \sin (\frac{\theta}{2}))$</code></p> <p>where <code>$\vec u$</code> describes the axis you rotate by.</p> <p>In this case <code>$R_y$</code> is the y-axis, so <code>$\vec u = \begin{pmatrix}0\\1\\0\end{pmatrix}$</code>.</p> Informatik am KIT http://martin-thoma.com/informatik-am-kit Sat, 07 Sep 2013 09:41:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/informatik-am-kit <p>Ich werde immer wieder gefragt, wie Informatik am KIT ist. Was kann ich &uuml;ber Karlsruhe erz&auml;hlen? Wieviel Praxis bekommt man in einem Informatik-Studium am KIT?</p> <p>Leider denke ich nicht, das ich wirklich gut dar&uuml;ber schreiben dann, da ich nur &bdquo;Informatik I&ldquo; an der Uni Augsburg geh&ouml;rt habe. Sonst war ich nur am KIT. Auch &uuml;ber Karlsruhe kann ich nicht so viel erz&auml;hlen, wie man sich vielleicht denkt. Ich bin meistens am studieren. Daher habe ich von Karlsruhe au&szlig;erhalb der Innenstadt bisher wenig gesehen.</p> <p>Ein paar Anhaltspunkte k&ouml;nnte die <a href="https://de.wikipedia.org/wiki/Karlsruher_Institut_f%C3%BCr_Technologie">Wikipediaseite des KIT</a> sowie die <a href="http://www.einstieg-informatik.de/index.php?article_id=162&hid=55">einstieg-informatik.de-Seite</a> geben.</p> <p>Genug allgemeines bla-bla. Nun lasse ich die Disclaimer-S&auml;tze (meinem Eindruck nach, ich kenne eigentlich nur das KIT und habe keine aussagekr&auml;ftigen Vergleiche, ...) weg und erz&auml;hle etwas &uuml;ber Karlsruhe und das KIT.</p> <h2>Das Studium</h2> <h3>Allgemeines</h3> <p>Die Regelstudienzeit des Bachelor-Informatik-Studium betr&auml;gt 6 Semester und 180 <a href="https://de.wikipedia.org/wiki/European_Credit_Transfer_System">ECTS</a>. Davon sind 15 ECTS f&uuml;r die Bachelor-Arbeit, 6 ECTS f&uuml;r Softskills (z.B. Sprachkurse und verpflichtent 2 ECTS f&uuml;r Teamarbeit in der Softwareentwicklung) und folgende Plicht-Kurse vorgesehen:</p> <table> <tr> <th>Lehrveranstaltung</th> <th>ECTS</th> <th>Weitere Links</th> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">1. Semester</th> </tr> <tr> <td><a href="../gbi-klausur/">Grundbegriffe der Informatik</a></td> <td>4</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../abschlussaufgaben-programmieren/">Programmieren</a></td> <td>5</td> <td><a href="../programmieren-tutorium/">Mein Tutorium</a></td> </tr> <tr> <td>H&ouml;here Mathematik I</td> <td>9</td> <td>&nbsp;</td> </tr> <tr> <td>Lineare Algebra I</td> <td>9</td> <td>&nbsp;</td> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">2. Semester</th> </tr> <tr> <td><a href="../algorithmen-klausur/">Algorithmen I</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../swt-i-klausur/">Softwaretechnik I</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../ti-klausur-dt-ro/">Rechnerorganisation</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td>H&ouml;here Mathematik II</td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td>Lineare Algebra II</td> <td>5</td> <td>&nbsp;</td> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">3. Semester</th> </tr> <tr> <td><a href="../tgi-klausur/">Theoretische Grundlagen der Informatik</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../pse-am-kit/">Praxis der Software-Entwicklung</a> (PSE)</td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../os-klausur/">Betriebssysteme</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../ti-klausur-dt-ro/">Digitaltechnik und Entwurfsverfahren</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../wt-klausur/">Wahrscheinlichkeitstheorie und Statistik</a></td> <td>4.5</td> <td>&nbsp;</td> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">4. Semester</th> </tr> <tr> <td><a href="../datenbanksysteme-klausur/">Datenbanksysteme</a></td> <td>4</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../rechnernetze-klausur/">Rechnernetze</a></td> <td>4</td> <td>&nbsp;</td> </tr> <tr> <td><a href="../numerik-klausur/">Numerik</a></td> <td>4.5</td> <td>&nbsp;</td> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">5. Semester</th> </tr> <tr> <td><a href="../algorithmen-ii-klausur/">Algorithmen II</a></td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <td>Programmierparadigmen</td> <td>6</td> <td>&nbsp;</td> </tr> <tr> <th colspan="3" style="background-color:#cdcdcd;">6. Semester</th> </tr> <tr> <td>Bachelorarbeit</td> <td>15</td> <td>&nbsp;</td> </tr> <tr> <td>`$\sum$`</td> <td>124</td> <td>&nbsp;</td> </tr> </table> <p>Ich habe &bdquo;<a href="../klausur-analysis-i-und-ii/">Analysis I+II</a>&ldquo; anstelle von &bdquo;H&ouml;here Mathematik I+II&ldquo; und &bdquo;<a href="../klausur-lineare-algebra-i-ii/">Lineare Algebra und analytische Geometrie I+II</a>&ldquo; anstelle von &bdquo;Lineare Algebra I+II&ldquo; geh&ouml;rt. Das sind die Mathematiker-Kurse.</p> <p>Wie ihr nun erkannt haben werdet, bleiben <code>$180 - 124 - 6 = 50$</code> &uuml;brig. Da ich die Mathematiker-Kurse gemacht habe (die jeweils 9 ECTS anstelle von 5 und 4 geben), bei mir sogar nur 41 ECTS. Davon muss man zwei Stammmodule f&uuml;r jeweils 6 ECTS machen. Dann sind es nur noch <code>$50-2 \cdot 6 = 38$</code> ECTS.</p> <p>Die Praxis der Softwareentwicklung (PSE) ist &uuml;brigens eine tolle Sache am KIT-Informatik-Studium. Dort sucht man sich aus einer vorgegebenen Auswahl an Projekten eines aus. Dieses bearbeitet man in einer Gruppe von 5 Studenten f&uuml;r ein halbes Jahr. Ich habe an einem Projekt des Frauenhofer Instituts gearbeitet, das sich UpToDatE (Upload automation and data entry) nannte. Mal schauen, vielleicht schreibe ich mal etwas dar&uuml;ber.</p> <h3>Stammmodule</h3> <ul> <li>Computergraphik</li> <li>Echtzeitsysteme</li> <li>Formale Systeme</li> <li><a href="../kogsys-klausur/">Kognitive Systeme</a></li> <li>Rechnerstrukturen</li> <li><a href="../sicherheit-klausur/">Sicherheit</a></li> <li>Softwaretechnik II</li> <li>Telematik</li> </ul> <h3>Proseminare</h3> <p>Die Informatik-Proseminare sind leider sehr schlecht organisiert. Ich habe auf GitHub ein &ouml;ffentliches Repository, wo ihr hoffentlich <a href="https://github.com/MartinThoma/kit/tree/master/Informatik/Proseminare">aktuelle Informationen &uuml;ber Info-Proseminare</a> finden (bzw. auch eintragen) k&ouml;nnt.</p> <h3>Softstkills</h3> <p>Von den 6 ECTS f&uuml;r Softskills sind ja schon 2 verpflichtend in Teamarbeit f&uuml;r die Softwareentwicklung (TSE - geh&ouml;rt zu PSE). Das ist nur ein Kniff mit dem Modulhandbuch, weil man wohl kein Stammmodul mit 8 ECTS machen konnte / wollte, also hat man PSE mit 6 ECTS und 2 ECTS f&uuml;r TSE. Praktisch bedeutet PSE auch so viel Arbeit, dass 8 ECTS angebracht sind (eher sogar mehr) und man muss im Team arbeiten. Man bekommt die Punkte also nicht geschenkt, aber man muss auch nichts au&szlig;erhalb von PSE daf&uuml;r machen.</p> <p>Von den 4 &uuml;brigen Punkten kann man sich aus vielen interessanten <a href="http://www.hoc.kit.edu/lehrangebot.php">Kursen des HOC</a> etwas aussuchen, z.B. <a href="http://www.spz.kit.edu/">Kurse des Sprachenzentrums</a>. Diese sind deutlich besser als die Sprachkurse in der Schule. Ich habe mich f&uuml;r <a href="http://www.spz.kit.edu/englisch.php#List">English C1: Advanced</a> entschieden. Da ich aber auch ein Tutorium gehalten habe (was 4 ECTS und 8,67 Euro/Stunde gibt), h&auml;tte ich das nicht machen m&uuml;ssen. Der Kurs war aber so toll, dass ich es nicht bereue. </p> <h3>Weitere Kurse</h3> <p>Ich habe folgendes belegt: <table> <tr> <td><a href="../web-engineering/">Web-Engineering</a></td> <td>4</td> </tr> <tr> <td>Algorithmen f&uuml;r planare Graphen</td> <td>5</td> </tr> </table></p> <p>SEHR viele weitere Kurse sind im <a href="http://www.informatik.kit.edu/1956.php">Modulhandbuch</a> zu finden.</p> <p>Hier ist &uuml;brigens mal ein Abh&auml;ngigkeitsgraph zum KIT-Bachelor-Informatik:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/09/informatikstudium-kit-abhaengigkeitsgraph-300x294.png"><img src="../images/2013/09/informatikstudium-kit-abhaengigkeitsgraph-300x294.png" alt="" width="300" height="294" class="size-medium wp-image-76453"/></a><p class="wp-caption-text"></p></div> <p>Es ist am KIT als Informatiker &uuml;brigens sehr leicht eine HiWi-Stelle zu finden.</p> <h3>Erg&auml;nzungsf&auml;cher</h3> <p>Man kann am KIT aus einer F&uuml;lle von <s>Nebenf&auml;chern</s> Erg&auml;nzungsf&auml;chern w&auml;hlen: <ul> <li>Elektro- und Informtionstechnik</li> <li>Maschinenbau</li> <li>Mathematik</li> <li>Physik</li> <li>Grundlagen des Rechts</li> <li>Volkswirtschaftslehre</li> <li>Betriebswirtschaftslehre</li> <li>Operation Research</li> </ul></p> <p>Auf Anfrage kann man aber wohl noch weitere machen. So studiert ein Bekannter in Richtung Medizinische Bildgebungsverfahren einiges.</p> <h4>Mathematik</h4> <table> <tr> <td>Proseminar</td> <td>3</td> <td><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/presentations/Diskrete-Mathematik">Mein Vortrag</a> zum Proseminar Diskrete Mathematik</td> </tr> <tr> <td><a href="../eaz-klausur/">Einf&uuml;hrung in die Algebra und Zahlentheorie</a></td> <td>9</td> </tr> <tr> <td>Topologie und Geometrie</td> <td>9</td> </tr> </table> <p>Man kann noch Analysis III und Funktionalanalysis / Hilbertr&auml;ume machen und vermutlich geht noch viel mehr, wenn man nachfragt.</p> <h3>Sonstiges</h3> <p>Das KIT hat eine 24h-Bibliothek (ja, die ist wirklich 24h offen, auch Sonntags. Meines Wissens macht die nur an Weihnachten zu), die <a href="http://atis.informatik.kit.edu/">ATIS</a> (tolle Lernr&auml;ume, viele Computer, Drucker, ein Scanner), ein <a href="http://www.scc.kit.edu/">Rechenzentrum</a>.</p> <p>Der Campus ist zusammenh&auml;ngend. Das, was als &bdquo;Campus Nord&ldquo; bezeichnet wird ist ein Forschungsbereich. Dort werden keine Vorlesungen gehalten. F&uuml;r Bachelor-Studenten ist der Campus Nord also irrelevant, au&szlig;er ihr wollt da einen Job.</p> <h3>Tipps zum Studium</h3> <ul> <li>Ganz unbescheiden: <strong>Mein Blog ist toll</strong> :-) Nein, im ernst, wenn du etwas vom Mathe-Stoff nicht verstehst, kann ich dir nur empfehlen mal rein zu schauen und vielleicht die Tags &bdquo;<a href="../tag/linear-algebra/">linear algebra</a>&ldquo; oder &bdquo;<a href="../tag/analysis/">analysis</a>&ldquo; zu durchst&ouml;bern. Ich blogge zu relativ vielen Themen, mal auf Deutsch und manchmal auf Englisch, die meistens f&uuml;r einen KIT-Informatik-Studenten von Interesse sind. Eventuell ist auch <a href="http://www.martin-thoma.de/uni.htm">meine kleine Linkliste</a> interessant.</li> <li><strong>Mathe ist interessant</strong>, aber wohl nicht jedermanns Sache. Ich denke ein guter Informatiker sollte auch gute Mathe-Kenntnisse haben. Noch kann ich nicht beurteilen, ob sich f&uuml;r mich das Besuchen der Mathe-Kurse (+Klausuren) gelohnt hat. Es war auf jeden Fall deutlich schwerer. Aber ich bin davon &uuml;berzeugt, dass es sich lohnen wird.</li> <li><strong>Bleib am Ball</strong>: Gerade in Mathe - egal ob Analysis oder HM - muss man immer versuchen am Ball zu bleiben. Vorbereitung (das Kapitel im Skript lesen) und Nachbereitung (am Abend kurz aufschreiben: Was wurde gemacht? Und dann kontrollieren: Kann ich das auch?) lohnen sich. Bzw., ich habe das im 2. Semester nicht gemacht und es hat sich bei der Klausurvorbereitung ger&auml;cht.</li> <li>Die ersten Vorlesungen sind besonders wichtig. In fast allen gibt es ein gutes Skript, das auch online ist. Fast &uuml;berall wird genau das Skript gemacht, nicht mehr und nicht weniger. Aber manchmal werden Dinge im <strong>Skript</strong> eher betont oder vielleicht etwas genauer erkl&auml;rt/ein Beispiel mehr gemacht. Also: Skript direkt am Anfang ausdrucken und immer mitnehmen.</li> <li><strong>Drucken</strong>: Bis auf die Skripte w&uuml;rde ich alles in der ATIS (und nicht im SCC) drucken. Du solltest nach der O-Phase beide Accounts haben.</li> <li><strong>&Uuml;bungsbl&auml;tter</strong>: Es lohnt sich, die &Uuml;bungsbl&auml;tter ordentlich zu machen. Sie sind, neben Altklausuren, die beste Klausurvorbereitung. Also: Mache deine L&ouml;sungen kleinschrittig, eventuell mit Erkl&auml;rungen die du in einem Semester nutzen kannst, schreibe sie sauber auf und mach alle. Egal wie schwer sie sind oder wie wenig Zeit du hast. Das wird - im 2. Semester - anstrengend, aber es lohnt sich. Also nicht nur auf die Punkte schauen, die du f&uuml;r den &Uuml;bungsschein brauchst, sondern auch an die bevorstehende Klausur denken.</li> </ul> <h3>FAQ</h3> <ul> <li><strong>Frage</strong>: Ich kann nich programmieren. Ist das schlimm? <strong>Antwort</strong>: Nein! Am KIT lernt man alles von Grund auf. In &bdquo;Programmieren&ldquo; lernt man Java, in &bdquo;Betriebssysteme&ldquo; grundlegendes C, in &bdquo;PSE&ldquo; - je nach dem was man macht - C++, Java, C#, in &bdquo;SWT I&ldquo; grundlagen &uuml;ber paralleles Programmieren mit Java.</li> <li><strong>Frage</strong>: Wie Praxisnah ist das Studium? <strong>Antwort</strong>: Kommt darauf an, was man sp&auml;ter machen will und was man als Vergleich nimmt. Vermutlich sind die Fachhochschulen n&auml;her an der Praxis, wenn man auf reines Programmieren hinaus will. Aber wenn ihr einfach nur im Beruf programmieren wollt, m&uuml;sst ihr nicht studieren. Vielleicht macht dann eine Ausbildung mehr Sinn.</li> <li><strong>Frage</strong>: Was lernt man in der Informatik, wenn nicht Programmieren? <strong>Antwort</strong>: Vieles. Algorithmen und Datenstrukturen, wie genau ein Rechner von einzelnen Transistoren, &uuml;ber Schaltungen, Schaltwerke, Maschinencode und Assembler funktioniert, was theoretische Berechnungsmodelle sind, was &uuml;berhaupt berechenbar ist, wie Computer lernen k&ouml;nnen, wie man mit Ungenauigkeit in Berechnungen umgeht, wie man Programme/Probleme sinnvoll strukturiert, was Sicherheit in der Informatik ist und wie man verschiedene Sicherheitsbegriffe zeigen kann...</li> <li><strong>Frage</strong>: Was ist charakteristisch f&uuml;r die Informatik am KIT? <strong>Antwort</strong>: Das KIT hat eine gro&szlig;e Informatik-Fakult&auml;t. Wenn man hier Informatik zu studieren beginnt, kann man sich in alle (oder zumindest viele) Richtungen weiterentwickeln. Au&szlig;erdem ist das Informatik-Studium am KIT sehr Mathematik-lastig.</li> <li><strong>Frage</strong>: Ich w&uuml;rde gerne XYZ lernen, aber das steht nicht im Modulhandbuch. Kann ich das trotzdem am KIT lernen? <strong>Antwort</strong>: Es gibt einen Studenten-Email-Verteiler. Dort kann man einfach mal fragen, ob andere auch interesse daran haben. Au&szlig;erdem gibt es <a href="http://www.kit.edu/studieren/studentische_einrichtungen.php">Hochschulgruppen</a>. Bei &uuml;ber 3000 Studenten wird sich schon jemand finden, der auch XYZ machen will / es kann.</li> </ul> <h2>Karlsruhe</h2> <p>Am KIT werden immer wieder interessante Vortr&auml;ge gehalten, z.B.</p> <ul> <li>Google Tech Talk: JavaScript and V8 - A functional-ish language and implementation in the mainstream</li> <li><a href="http://www.talkit.eu/talkit/index.php/thema-269.html">TalKIT</a></li> <li><a href="https://www.uni-karlsruhe.de/cos/EventList.php?cal_id=47&language=de&sort=time_asc&from_day=1&from_month=1&from_year=1990">Weitere</a></li> </ul> <p>Es gibt den <a href="http://www.scienceslam-karlsruhe.de/index/science_Slam_karlsruhe/science_Slam_karlsruhe.html">Science Slam Karlsruhe</a>, <a href="http://www.physik.kit.edu/Aktuelles/Physik_am_Samstag/">Physik am Samstag</a> und <a href="http://kalender.karlsruhe.de/kalender/db/termine">sehr viele weitere Veranstaltungen</a>.</p> <p>Falls man mehr &uuml;ber Karlsruhe wissen will: Auch dazu gibt es einen <a href="https://de.wikipedia.org/wiki/Karlsruhe">Wikipedia-Artikel</a>.</p> <h3>Wohnungen</h3> <p>Tja, eine Wohnung zu finden ist in Karlsruhe schwer. Mit der Wohnungssuche sollte man sehr fr&uuml;h beginnen. Es gibt zwar <a href="http://www.studentenwerk-karlsruhe.de/de/wohnen/wohnheime_ka/">einige Wohnheime</a>, aber auch die sind voll. Und die Qualit&auml;t der Wohnheime ist sehr unterschiedlich. Ich habe geh&ouml;rt, dass das HaDiKo und die Insterburg nicht so toll sind, aber das an der Waldhornstra&szlig;e soll sehr gut sein. Es gibt neben den Wohnheimen in dieser Liste noch mindestens eine weiteres (das <a href="http://www.ev-studentinnenwohnheim.de/">evangelische Studentinnen-Wohnheim</a> in R&uuml;purr). </p> <p>Die zentralen Wohnungen sind meistens Altbauwohnungen. Ich habe meine &uuml;ber studenten-wg.de gefunden. </p> <p>Allgemein gilt jedoch: Umso fr&uuml;her man sucht, umso besser.</p> <p>F&uuml;r einen Eindruck von Karlsruhe kann man sich meine <a href="https://www.google.com/maps/views/profile/116515806655836046525?gl=us">Photo-Spheres</a> anschauen.</p> Gedanken zur Bundestagswahl 2013 http://martin-thoma.com/gedanken-zur-bundestagswahl-2013 Fri, 06 Sep 2013 09:54:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/gedanken-zur-bundestagswahl-2013 <p>Am 22. September 2013 findet die Bundestagswahl 2013 statt. </p> <h2>Worum geht es?</h2> <iframe width="512" height="288" src="//www.youtube.com/embed/qP6ye8R_QEA" frameborder="0" allowfullscreen></iframe> <h2>Parteien</h2> <p>Ich werde jeweils zwei Videos verlinken. Eines von &bdquo;MrWissen2go&ldquo; und einen Wahlwerbespot der Parteien selbst. Die Parteien sind aufsteigend nach vermutlichem Ergebnis geordnet.</p> <h3>Piraten</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/Piratenpartei-logo.png" alt="Logo der Piratenpartei" width="300" height="140" class="size-full wp-image-76414" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>31.669</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>38,9 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>ca. 5&ndash;15 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>Transparenz</li> <li>Bedingungsloses Grundeinkommen</li> <li>Datenschutz und Internet</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td> <ul> <li><a href="https://www.piratenpartei.de/wp-content/uploads/2013/06/PP-Bund-BTW13v1.pdf">Vollst&auml;ndig als PDF</a> (recht gro&szlig;)</li> <li><a href="http://www.piraten-zur-wahl.de/index.php/hoerbuch/">als H&ouml;rbuch</a></li> </ul> </td> </tr> </table> <iframe width="512" height="288" src="//www.youtube.com/embed/GNE0NOhN0pU" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="//www.youtube.com/embed/d5dMwpfDCTM" frameborder="0" allowfullscreen></iframe> <h3>DIE LINKE.</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/die-linke.png" alt="DIE LINKE." width="250" height="56" class="size-full wp-image-76417" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>63.761</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>60 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>37,7 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>10 Euro Mindeslohn</li> <li>H&ouml;here Steuern auf hohe Einkommen</li> <li>H&ouml;here Sozialleistungen</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td> <ul> <li><a href="http://www.die-linke.de/fileadmin/download/wahlen2013/bundestagswahlprogramm/bundestagswahlprogramm2013_langfassung.pdf">Vollst&auml;ndig als PDF</a> (912 kB)</li> <li><a href="http://www.die-linke.de/fileadmin/download/wahlen2013/kurzfassung_audio/bundestagswahlprogramm2013_kurzfassung_weibliche_stimme.mp3">als H&ouml;rbuch</a> (6.1 MB)</li> </ul> </td> </tr> </table> <iframe width="512" height="288" src="//www.youtube.com/embed/TJzWq0O2k_Y" frameborder="0" allowfullscreen></iframe> <p>Ich konnte leider keinen &quot;offiziellen&quot; Wahlwerbespot finden. Aber der folgende Clip kommt dem am n&auml;chsten:</p> <iframe width="512" height="384" src="//www.youtube.com/embed/oUz1qPJ8NoA" frameborder="0" allowfullscreen></iframe> <h3>FDP</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/FDP-logo.png" alt="Logo der FDP" width="150" height="137" class="size-full wp-image-76421" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>58.675</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>53 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>23,0 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>Staatsschulden abbauen ohne Steuererh&ouml;hung</li> <li>B&uuml;rgergeld</li> <li>Soli abschaffen</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td><a href="http://www.fdp.de/files/408/B_rgerprogramm_A5_Online_2013-07-23.pdf">Vollst&auml;ndig als PDF</a></td> </tr> </table> <iframe width="512" height="288" src="//www.youtube.com/embed/UTIm_8-X4gM" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="//www.youtube.com/embed/IQQ5nREaJWs" frameborder="0" allowfullscreen></iframe> <h3>Gr&uuml;ne</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/gruenen-logo.png" alt="Logo von B&uuml;ndnis 90 - die Gr&uuml;nen" width="180" height="108" class="size-full wp-image-76422" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>60.808</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>48 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>37,8 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>H&ouml;here Steuern auf hohe Einkommen</li> <li>Kostenlose Kita-Pl&auml;tze</li> <li>8,50 Euro Mindestlohn</li> <li>B&uuml;rgerversicherung f&uuml;r alle</li> <li>Massentierhaltung abschaffen</li> <li>Gentechnik verhindern</li> <li>&Ouml;PNV billiger machen</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td> <ul> <li><a href="http://www.gruene.de/fileadmin/user_upload/Dokumente/Wahlprogramm/Wahlprogramm-barrierefrei.pdf">Vollst&auml;ndig als PDF</a></li> <li><a href="http://gruene-clips.de/content/Wahlprogramm-2013_Audio_mp3.zip">H&ouml;rbuch</a></li> </ul> </td> </tr> </table> <iframe width="512" height="288" src="//www.youtube.com/embed/LeHiHZ8m2rU" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="//www.youtube.com/embed/NwOcVbGn7Qs" frameborder="0" allowfullscreen></iframe> <h3>SPD</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/spd-logo.png" alt="SPD Logo" width="150" height="150" class="size-full wp-image-76423" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>472.469</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>59 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>31,5 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>H&ouml;here Steuern f&uuml;r h&ouml;here Einkommen</li> <li>Wahlalter auf 16 Jahre senken</li> <li>Kostenlose Kita-Pl&auml;tze</li> <li>Volle Rente ab 63 Jahren f&uuml;r alle, die min. 45 Jahre gearbeitet haben</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td><a href="http://www.spd.de/linkableblob/96686/data/20130415_regierungsprogramm_2013_2017.pdf">Vollst&auml;ndig als PDF</a></td> </tr> </table> <iframe width="512" height="288" src="//www.youtube.com/embed/WNkDGxaRutQ" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="//www.youtube.com/embed/ffG18Nz5cSQ" frameborder="0" allowfullscreen></iframe> <h3>CDU / CSU</h3> <table> <tr> <th colspan="2"><img src="../images/2013/09/cdu-partei.png" alt="CDU - Partei" width="250" height="74" class="size-full wp-image-76418" /></th> </tr> <tr> <th>Mitgliederzahl</th> <td>469.575</td> </tr> <tr> <th>Durch&shy;schnitts&shy;alter</th> <td>59 Jahre</td> </tr> <tr> <th>Frauen&shy;anteil</th> <td>25,6 Prozent</td> </tr> <tr> <th>Themen</th> <td> <ul> <li>konservativ (im Gro&szlig;en und Ganzen soll sich nichts &auml;ndern)</li> <li>mehr Kamera&uuml;berwachung</li> <li>Mieten sollen im &ouml;ffentlichen Raum nicht weiter ansteigen</li> </ul> </td> </tr> <tr> <th>Wahlprogramm</th> <td> <ul> <li><a href="http://www.cdu.de/sites/default/files/media/dokumente/cdu_regierungsprogramm_2013-2017.pdf">Vollst&auml;ndig als PDF</a> (683.47 kB)</li> <li><a href="http://www.cdu.de/sites/default/files/media/dokumente/bilanz-btw13.pdf">als H&ouml;rbuch</a> (1.44 MB)</li> </ul> </td> </tr> </table> <iframe width="512" height="384" src="//www.youtube.com/embed/99zpMPcgnHc" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="//www.youtube.com/embed/Mk06yfbXQYg" frameborder="0" allowfullscreen></iframe> <h2>Koalitionsm&ouml;glichkeiten</h2> <div style="width: 458px" class="wp-caption aligncenter"><a href="../images/2013/09/koalitionsrechner.png"><img src="../images/2013/09/koalitionsrechner.png" alt="" width="458" height="174" class="size-full wp-image-76427"/></a><p class="wp-caption-text"></p></div> <p>Die Parteien haben viele aussagen &uuml;ber Koalitionen nach der Bundestagswahl gemacht: <ul> <li>F&uuml;r CDU/CSU kommt die FDP und die SPD in Frage. (<a href="http://www.spiegel.de/politik/deutschland/kanzlerin-spricht-ueber-grosse-koalition-merkel-veraergert-fdp-a-917219.html">Quelle</a>)</li> <li>Die FDP will nur mit der Union eine Koalition. (<a href="http://www.n-tv.de/ticker/Westerwelle-schliesst-erneut-Koalition-mit-SPD-und-Gruenen-aus-article11278791.html">Quelle</a>)</li> <li>Rot-Rot-Gr&uuml;n wird es nicht geben. (<a href="http://www.sueddeutsche.de/politik/rot-rot-gruen-linke-phantasien-vor-der-bundestagswahl-1.1755513">Quelle</a>, siehe auch im Wahlprogramm der Gr&uuml;nen: &bdquo;Die Linke steht abseits des gr&uuml;nen Wandels.&ldquo;)</li> <li>Die SPD will eigentlich nur mit den Gr&uuml;nen. (<a href="http://www.n24.de/n24/Nachrichten/Politik/d/3468674/steinbrueck-oeffnet-tuerspalt-fuer-die-linke.html">Quelle</a>)</li> </ul></p> <p>Nun kann man Umfrageergebnisse betrachten:</p> <div style="width: 846px" class="wp-caption aligncenter"><a href="../images/2013/09/umfragen-bundestagswahl-2013.png"><img src="../images/2013/09/umfragen-bundestagswahl-2013.png" alt="" width="846" height="330" class="size-full wp-image-76428"/></a><p class="wp-caption-text"></p></div> <p>Damit steht fest: <ul> <li>CDU / CSU bleibt in der Regierung.</li> <li>Wenn die FDP die 5%-H&uuml;rde schafft, gibt es wieder Schwarz-Gelb.</li> <li>Sonst wirds vielleicht interessant, aber vermutlich Schwarz-Rot</li> </ul></p> <h2>Themen</h2> <p>Ich finde es interessant, welche Themen f&uuml;r die Parteien wichtig sind und welche in der &Ouml;ffentlichkeit h&auml;ufig diskutiert werden. Im folgenden mal einige Themen, die meiner Meinung nach wichtig sind.</p> <h3>Sozialer Ausgleich</h3> <p>Ich denke, dass in Deutschland die viel zitierte &bdquo;Schere zwischen Arm und Reich&ldquo; zu gro&szlig; wird. Zu dem Thema gibt es in den Wiki-Artikeln <a href="https://de.wikipedia.org/wiki/Einkommensverteilung_in_Deutschland">Einkommensverteilung in Deutschland</a> und <a href="https://de.wikipedia.org/wiki/Verm%C3%B6gensverteilung_in_Deutschland">Verm&ouml;gensverteilung in Deutschland</a> viele Informationen, z.B.: <ul> <li>2008 betrug nach Zahlen des DIW das mittlere verf&uuml;gbare Einkommen 1.252 Euro</li> <li>die &auml;rmsten 50% haben 1,4% des Verm&ouml;gens in Deutschland</li> <li>die Top 0,1 % haben 22,5% des Verm&ouml;gens in Deutschland</li> <li>die Top 10% haben 66,6% des Verm&ouml;gens in Deutschland</li> <li>5 Mio. verdienen weniger als 8,50 Euro pro Stunde (<a href="http://www.suedkurier.de/nachrichten/politik/schwerpunkt/Hintergrund-5-Mio-verdienen-weniger-als-8-50-Euro;art10035,5197727">Quelle</a>)</li> <li>Im Jahr 2011 sind an mehr als 1,21 Millionen Bedarfsgemeinschaften mit Aufstockern durchschnittlich 737 Euro je Monat gezahlt worden. (<a href="http://www.tagesschau.de/inland/hartziv222.html">Quelle</a>)</li> </ul></p> <p>Es ist sehr einfach, was dagegen hilft: <ul> <li>H&ouml;here Steuern auf h&ouml;here Einkommen</li> <li>Mindestlohn</li> <li>H&ouml;here Sozialleistungen f&uuml;r Arme</li> <li>H&ouml;he Erbschaftsverm&ouml;gen (um eine konkrete Zahl zu nennen: &gt; 10,000,000 Euro) m&uuml;ssen stark mit Erbschaftssteuer eingeschr&auml;nkt werden. Davor darf es keine &bdquo;Steuerflucht&ldquo; geben. (Existiert dieses Problem?)</li> </ul></p> <p>Ich bin au&szlig;erdem davon &uuml;berzeugt, dass viele Menschen, die eigentlich Anspruch auf Sozialleistungen h&auml;tten, diesen nicht in Anspruch nehmen. Zum einen, weil sie es nicht wollen (<a href="http://www.wdr2.de/aktuell/hartzvier122.html">Quelle</a>), zum anderen aber vermutlich auch, weil sie nicht wissen, dass sie Anspruch haben. </p> <p>Hier mal ein paar Leistungen, die es gibt: <ul> <li><a href="https://de.wikipedia.org/wiki/Arbeitslosengeld">Arbeitslosengeld</a></li> <li><a href="https://de.wikipedia.org/wiki/Arbeitslosengeld_II">Arbeitslosengeld II</a></li> <li><a href="https://de.wikipedia.org/wiki/Baf%C3%B6g">BAf&ouml;G</a></li> <li>Hartz IV</li> <li><a href="https://de.wikipedia.org/wiki/Kinderzuschlag">Kinderzulage</a></li> <li><a href="https://de.wikipedia.org/wiki/Kindergeld_(Deutschland)">Kindergeld</a></li> <li><a href="https://de.wikipedia.org/wiki/Kinderkrankengeld">Kinderkrankengeld</a></li> <li><a href="https://de.wikipedia.org/wiki/Elterngeld_(Deutschland)">Elterngeld</a></li> <li><a href="https://de.wikipedia.org/wiki/%C3%9Cbergangsgeld">&Uuml;bergangsgeld</a></li> <li><a href="https://de.wikipedia.org/wiki/Wohngeld">Wohngeld</a></li> <li><a href="https://de.wikipedia.org/wiki/Wohnungshilfe">Wohnungshilfe</a></li> </ul></p> <p>In der <a href="https://de.wikipedia.org/wiki/Kategorie:Sozialleistung_(Deutschland)">Kategorie:Sozialleistung (Deutschland)</a> findet man noch viel mehr.</p> <h3>Eurokrise</h3> <p>Die <a href="https://de.wikipedia.org/wiki/Eurokrise">Eurokrise</a> muss beendet werden. Wichtige Zahlen dazu sind: <ul> <li>Die Jugendarbeitslosigkeit in Spanien betrug 2012 ca. 24,9%.</li> <li>Griechenland: Arbeitslosigkeit bei Menschen mit Hochschulbildung unter 24 Jahren: 28,8% - in Deutschland 12,8%</li> <li>In Griechenland betrug die Arbeitslosigkeit 2011 ca. 17,6%</li> <li>Die <a href="https://de.wikipedia.org/wiki/Staatsverschuldung#Staatsverschuldung_in_entwickelten_L.C3.A4ndern">Staatverschuldung</a> ist katastrophal - egal ob man Deutschland, Frankreich, Spanien, Griechenland oder Italien anschaut.</li> </ul></p> <p>Hier kann man nicht davon ausgehen, dass irgendeine Partei eine belegbar gute L&ouml;sung vorbringt. Wie auch? Das Problem gab es noch nie. Aber die Frage nach dem, was man zu tun gedenkt ist doch interessant:</p> <ul> <li>CDU / CSU: <ul> <li>F&uuml;r: Sparma&szlig;nahmen, Schuldenbremse, <a href="https://de.wikipedia.org/wiki/Stabilit%C3%A4ts-_und_Wachstumspakt">Stabilit&auml;tspakt</a>, Europ&auml;ische Bankenunion</li> <li>Gegen: Eurobonds</li> </ul> <li>SPD: <ul> <li>F&uuml;r: Finanztransaktionssteuer</li> </ul> </li> <li>DIE LINKE.: <ul> <li>F&uuml;r: Einmalige Abgabe von 10% auf Verm&ouml;gen zur Schuldentilgung bei einem Freibetrag von 1.000.000 Euro auf Privatverm&ouml;gen und 2.000.000 Euro auf Betriebsverm&ouml;gen; Finanztransaktionssteuer</li> </ul> </li> <li>Piraten: <ul> <li>F&uuml;r: Finanztransaktionssteuer; Schuldenschnitte</li> </ul> </li> <li>Gr&uuml;ne: <ul> <li>F&uuml;r: Verm&ouml;gensabgabe (vergleichbar mit LINKE)</li> </ul> </li> </ul> <p>Das ist selbstverst&auml;ndlich keine vollst&auml;ndige Liste. Wenn es einen wirklich interessiert, sollte man das Wahlprogramm der Parteien danach durchsuchen.</p> <h3>Korruption und Transparenz</h3> <p>Korruption kann dazu f&uuml;hren, dass Entscheidungen getroffen werden, die f&uuml;r den Staat nicht optimal sind. Dazu sollte Abgeordnetenbestechung zuerst einmal illegal sein, also ein &bdquo;Anti-Korruptionsgesetz&ldquo; eingef&uuml;hrt werden. Dagegen wehren sich aber CDU/CSU und FDP sehr. Es gab auch schon eine <a href="http://www.abgeordnetenwatch.de/schaerfere_regeln_gegen_abgeordnetenbestechung-605-525.html">Abstimmung Sch&auml;rfere Regeln gegen Abgeordnetenbestechung</a> - kontrolliert doch selbst, wie eure Abgeordneten abgestimmt haben.</p> <p>Au&szlig;erdem f&uuml;hrt der Verdacht auf bestechliche Politiker zu weiterer Politikverdrossenheit.</p> <p>Siehe zu Abgeordnetenbestechung: <ul> <li><a href="http://beta.abgeordnetenwatch.de/blog/2013-06-07/blockade-bei-abgeordnetenbestechung-ausschussvorsitzender-kauder-uebt-scharfe-kritik">Blockade bei Abgeordnetenbestechung</a></li> <li><a href="http://beta.abgeordnetenwatch.de/blog/2013-08-14/abgeordnetenbestechung-mit-wem-will-seehofer-eigentlich-eine-gesetzesverschaerfung">Abgeordnetenbestechung: Mit wem will Seehofer eigentlich eine Gesetzesversch&auml;rfung durchsetzen?</a></li> <li><a href="http://beta.abgeordnetenwatch.de/blog/2013-06-26/ueberraschung-bundestag-soll-doch-noch-ueber-abgeordnetenbestechung-abstimmen">&Uuml;berraschung: Bundestag soll doch noch &uuml;ber Abgeordnetenbestechung abstimmen</a></li> </ul></p> <h3>Energiewende</h3> <p>Die Versorgung mit Energie ist ein essentieller bestandteil der &ouml;ffentlichen Infrastruktur. Sei es in Form von elektrischer Energie f&uuml;r Haushalte und Firmen, in Form von W&auml;rme oder in Form von Mobilit&auml;t. Dabei w&auml;re es sch&ouml;n, das Problem nachhaltig zu l&ouml;sen. </p> <p>Momentan geschieht dies in Form von <a href="https://de.wikipedia.org/wiki/Liste_von_Onshore-Windparks_in_Deutschland">On</a>- und <a href="https://de.wikipedia.org/wiki/Liste_der_Offshore-Windparks">Offshore Windkraftparks</a> sowie im <a href="https://de.wikipedia.org/wiki/Netzausbau">Netzausbau</a>. Das <a href="https://de.wikipedia.org/wiki/Erneuerbare-Energien-Gesetz">Erneuerbare-Energien-Gesetz</a> (EEG) soll dabei helfen und regelt die sog. <a href="https://de.wikipedia.org/wiki/Einspeiseverg%C3%BCtung">Einspeiseverg&uuml;tung</a>.</p> <h3>Steuern</h3> <p>Im Bezug auf Steuern sehe ich zwei gro&szlig;e Probleme: <ol> <li>Konzerne spielen L&auml;nder gegeneinander aus</li> <li>Steuern sind in Deutschland kompliziert</li> </ol></p> <p>Das Konzerne L&auml;nder gegeneinander ausspielen, sieht man an Google (<a href="http://www.googlewatchblog.de/2012/11/frankreich-milliarden-euro-steuernachzahlung/">Quelle</a>). Versteht mich jetzt nicht falsch, ich finde Google super. Aber jedes Unternehmen wird, wenn es ihm auf legale Art m&ouml;glich ist, versuchen Kosten (also auch Steuern) so niedrig wie m&ouml;glich zu halten. Also sollte man sich doch innerhalb der Euro-Zone auf ein gemeinsames Steuersystem einigen k&ouml;nnen, oder?</p> <p>Au&szlig;erdem scheint es mir in Deutschland zu viele Steuern/Abgaben zu geben und diese auch zu kompliziert zu sein Sinnvoll finde ich <ul> <li>Erbschaftssteuer: Sie sorgt daf&uuml;r, dass sich Reichtum weniger stark anh&auml;uft.</li> <li><span class="hint" title="Mehrwertsteuer">Umsatzsteuer</span>: Sie stellt einen einfachen Weg dar, wie der Staat an Geld kommt. Sie betrifft alle gleichm&auml;&szlig;ig. Ich finde es nicht sinnvoll, hier zwischen verschiedenen Klassen (Lebensmittel, Luxusg&uuml;ter) zu unterscheiden. Wenn Lebensmittel mehr kosten w&uuml;rden, w&uuml;rde man ihren Wert vielleicht mehr sch&auml;tzen. </li> <li>Einkommensteuer: Auch mit der Lohnsteuer bekommt der Staat viel Geld. Aber im Gegensatz zur Umsatzsteuer kann man hier Leute, die viel Verdienen st&auml;rker belasten.</li> <li>Energiesteuern: Durch Energiesteuern kann man Anreize schaffen, sparsame Ger&auml;te / Infrastruktur zu entwickeln. Dies sollte f&uuml;r die B&uuml;rger auf lange Sicht von Vorteil sein.</li> <li><span class="hint" title="Tabaksteuer">Rauschmittelsteuern</span>: Eigentlich sollten Menschen nicht rauchen und saufen. Also sollten diese Produkte - obwohl sie eventuell billig in der Herstellung sind - teuer verkauft werden. Die Steuer sollte s&uuml;chtigen dazu dienen, von ihrer Sucht frei zu kommen bzw. in die Suchtpr&auml;vention gesteckt werden.</li> <li>Grundsteuer: Durch eine hohe Grundsteuer nutzt vermutlich derjenige, der am meisten damit verdienen kann, das Grundst&uuml;ck. Sie kann also eine gute Verteilung dieser knappen Ressource erm&ouml;glichen.</li> </ul></p> <p>Steuern/Abgaben die ich nicht verstehe, sind: <ul> <li><a href="https://de.wikipedia.org/wiki/Solidarit%C3%A4tszuschlag">Solidarit&auml;tszuschlag</a></li> <li><a href="https://de.wikipedia.org/wiki/Kirchensteuer_(Deutschland)">Kirchensteuer</a>: Das sollte die Kirche selbst machen!</li> <li>Arbeitslosenversicherung: Sollte durch Umsatz- und Einkommenssteuer gedeckt werden. Grundst&auml;tzlich denke ich sollte hier jeder gleich versichert sein. Wenn jemand mehr als grundlegende Leistungen will, soll er das Privat machen. Aber eine gewisse Grundsicherung soll jeder bekommen.</li> <li>Krankenversicherung: Siehe Arbeitslosenversicherung</li> <li>Pflegeversicherung: Siehe Arbeitslosenversicherung</li> <li>Tabak, Alkopop, Schaumwein: Sollte eine &bdquo;Rauschmittelsteuer&ldquo; sein</li> <li><a href="https://de.wikipedia.org/wiki/Grunderwerbsteuer_(Deutschland)">Grunderwerbssteuer</a>: Warum wird Grunderwerb extra gez&auml;hlt? Warum nicht einfach nur Umsatzsteuer?</li> <li><a href="https://de.wikipedia.org/wiki/Zinsabschlag">Kapitalertragsteuer</a>: Warum ist das nicht einfach Einkommenssteuer?</li> <li>Versicherungsteuer, <a href="https://de.wikipedia.org/wiki/Kraftfahrzeugsteuer">Kraftfahrzeugsteuer</a>: Siehe Grunderwerbsteuer</li> <li>Stromsteuer: Inwiefern unterscheided sie sich von der Energiesteuer?</li> </ul></p> <p>Ganz allgemein sollte es wenig S1teuern geben. Die Steuer die es gibt, sollten einfach zu verstehen und zu berechnen sein. Au&szlig;erdem sollte es eine vollst&auml;ndige, aktuelle, frei verf&uuml;gbare Liste der Steuern sowie der Berechnung selbiger geben.</p> <p>Ich wei&szlig; nicht, wie die Lohnsteuer berechnet wird. Sinnvoll w&uuml;rde ich folgende Berechnung finden: <ul> <li>Am Ende eines Jahres wird das Einkommen (Lohn, Kapitalertr&auml;ge) berechnet.</li> <li>Sei dieses Gesamteinkommen <code>$x$</code> (in Euro): <ul> <li><code>$x \leq 12.000$</code>: Keine Steuer</li> <li><code>$x \leq 24.000$</code>: 15% Steuer. Die zu bezahlende Steuer ist also <code>$(x - 12.000) \cdot \frac{15}{100}$</code></li> <li><code>$x \leq 36.000$</code>: 20% Steuer. Die zu bezahlende Steuer ist also <code>$(36.000 - 12.000) \cdot \frac{15}{100} + (x-24.000) \cdot \frac{20}{100}$</code></li> <li>...</li> <li><code>$x &gt; 120.000$</code>: 50% Steuer. Die zu bezahlende Steuer ist also <code>$(36.000 - 12.000) \cdot \frac{15}{100} + (36.000-24.000) \cdot \frac{20}{100} + \dots + (x-120.000) \cdot \frac{50}{100}$</code></li> </ul> </li> </ul></p> <p>Bitte h&auml;ngt euch nicht an den Zahlen auf. Das sollte nur das System veranschaulichen. Mit diesem System w&auml;re es ganz einfach zu berechnen, wer wieviel zahlen muss. Damit kann es auch nicht passieren, dass jemand trotz h&ouml;herem Einkommen weniger Geld hat. </p> <p>Hier mal eine Grafik &uuml;ber das Steueraufkommen in Deutschland:</p> <div style="width: 800px" class="wp-caption aligncenter"><a href="../images/2013/09/steueraufkommen-deutschland.png"><img src="../images/2013/09/steueraufkommen-deutschland.png" alt="" width="800" height="512" class="size-full wp-image-76434"/></a><p class="wp-caption-text"></p></div> <p>Es gibt noch den Ansatz der &bdquo;<a href="https://de.wikipedia.org/wiki/Flat_Tax">Flat Tax</a>&ldquo;, die Steuern einfacher machen soll. Ob das sinnvoll ist, kann ich nicht sagen. Aber eine Vereinfachung verbunden mit einer Europ&auml;ischen Vereinheitlichung k&ouml;nnte Firmen entlasten und Steuerschlupfl&ouml;cher schlie&szlig;en.</p> <h3>B&uuml;rgerrechte</h3> <p>Im <a href="https://de.wikipedia.org/wiki/%C3%9Cberwachungs-_und_Spionageaff%C3%A4re_2013">Sp&auml;hskandal</a> (NSA, Prism, Tempora, Xkeyscore, ...) hat die CDU/CSU bisher nichts gemacht, um f&uuml;r Aufkl&auml;rung und Beendigung der illegalen Praktiken zu sorgen.</p> <p>In einigen anderen Berechen wurden jedoch kritische Gesetze/Projekte/Aussagen umgesetzt/gestartet/gemacht: <ul> <li>Verkauf von Meldedaten, manchmal auch &bdquo;Bestandsdatenauskunft&ldquo; genannt (<a href="http://beta.abgeordnetenwatch.de/2013/02/27/erfolgreicher-protest-verbraucherfeindliches-meldegesetz-beerdigt">Quelle</a>)</li> <li>Mehr <a href="https://de.wikipedia.org/wiki/Video%C3%BCberwachung">Video&uuml;berwachung</a></li> <li><a href="http://www.spiegel.de/netzwelt/web/sascha-lobo-ueber-friedrichs-realitaetsferne-sicht-auf-die-nsa-affaere-a-920041.html">Friedrich nimmt NSA in Schutz</a></li> <li>Vorratsdatenspeicherung (siehe <a href="http://www.abgeordnetenwatch.de/vorratsdatenspeicherung-636-140----abst_ja.html">Abstimmung</a>, <a href="http://www.abgeordnetenwatch.de/eu_richtlinie_zur_vorratsdatenspeicherung-136-131.html">EU-Richtlinie</a>)</li> </ul></p> <p>Aber auch die SPD scheint in dem NSA-Skandal nicht ganz unbeteiligt zu sein (<a href="http://www.tagesschau.de/inland/bndnsa100.html">Quelle</a>). Auch die Vorratsdatenspeicherung haben sie mit beschlossen.</p> <p>Die Gr&uuml;nen und Piraten sind gegen Video&uuml;berwachung, wollen das Fernmeldegeheimnis zu einem Kommunikations- und Mediennutzungsgeheimnis ausweiten, gegen die Bestandsdatenauskunft vorgehen und Vorratsdatenspeicherung verhindern.</p> <h3>Kleine Themen</h3> <p>Mit folgenden Themen scheinen die Parteien ihren Wahlkampf zu betreiben. Obwohl sie f&uuml;r einzelne Leute sehr wichtig sein m&ouml;gen, glaube ich das sie im gro&szlig;en und ganzen zu vernachl&auml;ssigen sind. Verglichen mit den obigen Themen betreffen die folgenden Themen nur wenige Leute. Einiges davon habe ich aus dem <a href="http://www.wahl-o-mat.de">Wahl-o-mat</a>:</p> <ul> <li>Adoptionsrecht / Gleichstellung f&uuml;r Homosexuelle</li> <li>Betreuungsgeld</li> <li>Syrien-Krise</li> <li>Generelles Tempolimit auf Autobahnen</li> <li>NATO-Austritt Deutschlands; R&uuml;stungsexporte; Milit&auml;rische Beteiligungen Deutschlands</li> <li>Aufnahme von mehr Fl&uuml;chtigen</li> <li>Einwanderung</li> <li>Lohnersatzleistungen bei Pflege von Angeh&ouml;rigen</li> <li>Frauenquote in Aufsichtsr&auml;ten</li> <li>Renteneintrittsalter</li> <li>Ehegattensplitting</li> <li>Autobahn-Maut f&uuml;r Ausl&auml;nder</li> </ul> <h2>Abschlie&szlig;ende Worte</h2> <p>Dieser Artikel stellt nur eine kurze Zusammenfassung von Gedanken dar, die mir wichtig oder interessant zu sein scheinen. Bitte denkt &uuml;ber die Themen nach und &uuml;berlegt euch: <ul> <li>Bin ich mit der Politik der letzten 4 Jahre zufrieden?</li> <li>Was ist mir wichtig?</li> </ul></p> <p>Wenn man nur auf die grobe Ausrichtung der Parteien betrachtet, kann man eventuell sagen: <ul> <li>Wenn man Grunds&auml;tzlich mit der Politik der letzten Jahre zufrieden ist, sollte man CDU/CSU w&auml;hlen.</li> <li>Wenn man Wert auf Transparenz legt, und will das Internetkompetenz in das Parlament kommt, sollte man die Piraten w&auml;hlen.</li> <li>Wenn man auf Umweltschutz, neue (aber nicht radikale) Ideen, wert legt, sollte man die Gr&uuml;nen w&auml;hlen</li> <li>Wenn man extreme &Auml;nderungen im sozialen Bereich will, sollte man DIE LINKE w&auml;hlen.</li> <li>Wenn man CDU/CSU und FDP wieder sehen will, und will das auf Datenschutz-Aspekte mehr wert gelegt wird, sollte man FDP w&auml;hlen.</li> <li>SPD: Hmm ... wenn man das gleiche in Rot will, was man schon kennt? Ich kann keinen wirklichen Themenschwerpunkt finden, in dem sich die SPD stark von der CDU/CSU abhebt.</li> </ul></p> <p>Wenn es euch irgendwie k&uuml;mmert, was in Deutschland passiert, solltet ihr w&auml;hlen gehen.</p> <h2>Links</h2> <ul> <li><a href="http://www.youtube.com/watch?v=X9Xhlz4uEmc">Aussagelose Wahlslogans</a></li> </ul> Gauß'sche Zahlen und verwandte Ringe http://martin-thoma.com/gaussche-zahlen-und-verwandte-ringe Wed, 04 Sep 2013 07:16:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/gaussche-zahlen-und-verwandte-ringe <p>Sei <code>$\mathbb{Z}[\sqrt{z}]$</code> mit <code>$z \in \mathbb{Z}$</code> der kleinste Ring, der <code>$\mathbb{Z}$</code> und <code>$\sqrt{z}$</code> enth&auml;lt. Sei <code>$A := \{a + b \sqrt{z} | a, b \in \mathbb{Z}\}$</code>.</p> <p><strong>Behauptung</strong>: <code>$\mathbb{Z}[\sqrt{z}] = A$</code> <strong>Beweis</strong>: z.Z.: <code>$\mathbb{Z}[\sqrt{z}] \subseteq A$</code> und <code>$\mathbb{Z}[\sqrt{z}] \supseteq A$</code></p> <p>Zuerst zeige ich <code>$\mathbb{Z}[\sqrt{z}] \supseteq A$</code>:</p> <ul> <li>`$\mathbb{Z}[\sqrt{z}]$` enth&auml;lt `$\mathbb{Z} \Rightarrow \{a \in \mathbb{Z}\} \subseteq \mathbb{Z}[\sqrt{z}]$`</li> <li>`$\mathbb{Z}[\sqrt{z}]$` enth&auml;lt `$\sqrt{z} \Rightarrow \{\sqrt{z}\} \subseteq \mathbb{Z}[\sqrt{z}]$`</li> <li>`$\mathbb{Z}[\sqrt{z}]$` ist ein Ring, also ist `$(\mathbb{Z}[\sqrt{z}], +)$` eine abelsche Gruppe.</li> <li>`$\Rightarrow A \subseteq \mathbb{Z}[\sqrt{z}]$`</li> </ul> <p>Nun <code>$\mathbb{Z}[\sqrt{z}] \subseteq A$</code>: <ul> <li><code>$(A, +) \leq (\mathbb{R}, +)$</code>, denn (UG-Kriterium) <ul> <li><code>$0 = 0 + 0 \sqrt{z} \in A \Rightarrow A \neq \emptyset$</code></li> <li><code>$\forall (a+b \sqrt{z}), (c + d \sqrt{z}) \in A:$</code> <code>$(a+b\sqrt{z}) - (c+d\sqrt{z}) = \underbrace{(a-c)}_{\in \mathbb{Z}} + \underbrace{(b-d)}_{\in \mathbb{Z}} \sqrt{z} \in A$</code></li> </ul> </li> <li><code>$(A, +)$</code> ist abelsch, da <code>$(\mathbb{R}, +)$</code> abelsch ist</li> <li><code>$(A, \cdot)$</code> ist Untermonoid von <code>$(\mathbb{R}, \cdot)$</code>, denn <ul> <li><code>$1 = 1 + 0 \sqrt{z} \in A$</code></li> <li><code>$\forall (a+b \sqrt{z}), (c + d \sqrt{z}) \in A:$</code> <code>$(a+b\sqrt{z}) \cdot (c+ d\sqrt{z}) = \underbrace{(ac + z bd)}_{\in \mathbb{Z}} + \underbrace{(ad + bc)}_{\in \mathbb{Z}} \sqrt{z} \in A$</code></li> </ul> </li> <li>Distributivgesetze: Vererben sich aus <code>$(\mathbb{R}, \cdot)$</code></li> <li><code>$\Rightarrow \mathbb{Z}[\sqrt{z}] \subseteq A$</code></li> </ul></p> <p><code>$\Rightarrow \mathbb{Z}[\sqrt{z}] = A \blacksquare$</code></p> How to solve linear congruence equations http://martin-thoma.com/solve-linear-congruence-equations Sun, 01 Sep 2013 15:43:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/solve-linear-congruence-equations <p>When you have a system of linear congruences like:</p> <p><code> $$ \begin{align} x &amp;\equiv 4 \mod 19\\ x &amp;\equiv 12 \mod 37\\ x &amp;\equiv 14 \mod 43 \end{align} $$</code></p> <p>you can solve it quite easily. Johannes Schickling has written a very nice <a href="http://schickling.github.io/algorithms/#/chinese-remainder-theorem">JavaScript Application</a> that applies the following algorithm online. I&#39;ve used his source code to write the following Python code.</p> <h2>Pseudocode</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/09/SolveLinearCongruences.png"><img src="../images/2013/09/SolveLinearCongruences.png" alt="" width="500" height="247" class="size-full wp-image-76382"/></a><p class="wp-caption-text"></p></div> <h2>Python</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">ExtendedEuclideanAlgorithm</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> Calculates gcd(a,b) and a linear combination such that</span> <span class="sd"> gcd(a,b) = a*x + b*y</span> <span class="sd"> As a side effect:</span> <span class="sd"> If gcd(a,b) = 1 = a*x + b*y</span> <span class="sd"> Then x is multiplicative inverse of a modulo b.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">aO</span><span class="p">,</span> <span class="n">bO</span> <span class="o">=</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="n">x</span><span class="o">=</span><span class="n">lasty</span><span class="o">=</span><span class="mi">0</span> <span class="n">y</span><span class="o">=</span><span class="n">lastx</span><span class="o">=</span><span class="mi">1</span> <span class="k">while</span> <span class="p">(</span><span class="n">b</span><span class="o">!=</span><span class="mi">0</span><span class="p">):</span> <span class="n">q</span><span class="o">=</span> <span class="n">a</span><span class="o">/</span><span class="n">b</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">%</span><span class="n">b</span> <span class="n">x</span><span class="p">,</span> <span class="n">lastx</span> <span class="o">=</span> <span class="n">lastx</span><span class="o">-</span><span class="n">q</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span> <span class="n">y</span><span class="p">,</span> <span class="n">lasty</span> <span class="o">=</span> <span class="n">lasty</span><span class="o">-</span><span class="n">q</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">y</span> <span class="k">return</span> <span class="p">{</span> <span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="n">lastx</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="n">lasty</span><span class="p">,</span> <span class="s">&quot;gcd&quot;</span><span class="p">:</span> <span class="n">aO</span> <span class="o">*</span> <span class="n">lastx</span> <span class="o">+</span> <span class="n">bO</span> <span class="o">*</span> <span class="n">lasty</span> <span class="p">}</span> <span class="k">def</span> <span class="nf">solveLinearCongruenceEquations</span><span class="p">(</span><span class="n">rests</span><span class="p">,</span> <span class="n">modulos</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> Solve a system of linear congruences.</span> <span class="sd"> &gt;&gt;&gt; solveLinearCongruenceEquations([4, 12, 14], [19, 37, 43])</span> <span class="sd"> {&#39;congruence class&#39;: 22804, &#39;modulo&#39;: 30229}</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">rests</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">modulos</span><span class="p">)</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">M</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">modulos</span><span class="p">)</span> <span class="k">for</span> <span class="n">mi</span><span class="p">,</span> <span class="n">resti</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">modulos</span><span class="p">,</span> <span class="n">rests</span><span class="p">):</span> <span class="n">Mi</span> <span class="o">=</span> <span class="n">M</span> <span class="o">/</span> <span class="n">mi</span> <span class="n">s</span> <span class="o">=</span> <span class="n">ExtendedEuclideanAlgorithm</span><span class="p">(</span><span class="n">Mi</span><span class="p">,</span> <span class="n">mi</span><span class="p">)[</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">e</span> <span class="o">=</span> <span class="n">s</span> <span class="o">*</span> <span class="n">Mi</span> <span class="n">x</span> <span class="o">+=</span> <span class="n">resti</span> <span class="o">*</span> <span class="n">e</span> <span class="k">return</span> <span class="p">{</span><span class="s">&quot;congruence class&quot;</span><span class="p">:</span> <span class="p">((</span><span class="n">x</span> <span class="o">%</span> <span class="n">M</span><span class="p">)</span> <span class="o">+</span> <span class="n">M</span><span class="p">)</span> <span class="o">%</span> <span class="n">M</span><span class="p">,</span> <span class="s">&quot;modulo&quot;</span><span class="p">:</span> <span class="n">M</span><span class="p">}</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">doctest</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span> </code></pre></div> <h2>Links</h2> <ul> <li><a href="http://schickling.github.io/algorithms/#/chinese-remainder-theorem">Try it online</a></li> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/SolveLinearCongruences">Sources</a></li> </ul> How to calculate the Legendre symbol http://martin-thoma.com/calculate-legendre-symbol Sun, 01 Sep 2013 11:05:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/calculate-legendre-symbol <h2>Pseudocode</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/09/Calculate-Legendre.png"><img src="../images/2013/09/Calculate-Legendre.png" alt="" width="500" height="528" class="size-full wp-image-76379"/></a><p class="wp-caption-text"></p></div> <h2>Python</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">isPrime</span><span class="p">(</span><span class="n">a</span><span class="p">):</span> <span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">a</span> <span class="o">%</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">a</span><span class="p">))</span> <span class="c"># http://stackoverflow.com/a/14793082/562769</span> <span class="k">def</span> <span class="nf">factorize</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">factors</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="k">while</span><span class="p">(</span><span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">):</span> <span class="c">#while we can divide by smaller number, do so</span> <span class="n">factors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="n">p</span> <span class="n">p</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c">#p is not necessary prime, but n%p == 0 only for prime numbers</span> <span class="k">if</span> <span class="n">p</span> <span class="o">&gt;</span> <span class="n">n</span> <span class="o">/</span> <span class="n">p</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span> <span class="n">factors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">return</span> <span class="n">factors</span> <span class="k">def</span> <span class="nf">calculateLegendre</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">p</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;</span> <span class="sd"> Calculate the legendre symbol (a, p) with p is prime.</span> <span class="sd"> The result is either -1, 0 or 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(3, 29)</span> <span class="sd"> -1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(111, 41) # Beispiel aus dem Skript, S. 114</span> <span class="sd"> -1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(113, 41) # Beispiel aus dem Skript, S. 114</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(2, 31)</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(5, 31)</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(150, 1009) # http://math.stackexchange.com/q/221223/6876</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(25, 1009) # http://math.stackexchange.com/q/221223/6876</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(2, 1009) # http://math.stackexchange.com/q/221223/6876</span> <span class="sd"> 1</span> <span class="sd"> &gt;&gt;&gt; calculateLegendre(3, 1009) # http://math.stackexchange.com/q/221223/6876</span> <span class="sd"> 1</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="k">if</span> <span class="n">a</span> <span class="o">&gt;=</span> <span class="n">p</span> <span class="ow">or</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">calculateLegendre</span><span class="p">(</span><span class="n">a</span> <span class="o">%</span> <span class="n">p</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="k">elif</span> <span class="n">a</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">a</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">a</span> <span class="k">elif</span> <span class="n">a</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="k">if</span> <span class="n">p</span><span class="o">%</span><span class="mi">8</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">p</span><span class="o">%</span><span class="mi">8</span> <span class="o">==</span> <span class="mi">7</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span> <span class="k">elif</span> <span class="n">a</span> <span class="o">==</span> <span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="k">if</span> <span class="n">p</span><span class="o">%</span><span class="mi">4</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">isPrime</span><span class="p">(</span><span class="n">a</span><span class="p">):</span> <span class="n">factors</span> <span class="o">=</span> <span class="n">factorize</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">product</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">pi</span> <span class="ow">in</span> <span class="n">factors</span><span class="p">:</span> <span class="n">product</span> <span class="o">*=</span> <span class="n">calculateLegendre</span><span class="p">(</span><span class="n">pi</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span> <span class="k">return</span> <span class="n">product</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="p">((</span><span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span> <span class="ow">or</span> <span class="p">((</span><span class="n">a</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">calculateLegendre</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">calculateLegendre</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">doctest</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span> </code></pre></div> <h2>More</h2> <ul> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents/eaz">Rules how to calculate with Legendre symbols</a></li> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/Calculate-Legendre">Python and Pseudocode source files</a></li> </ul> How many Homomorphisms exist between Z/nZ and Z/mZ? http://martin-thoma.com/how-many-homomorphisms-exist-between-znz-and-zmz Tue, 27 Aug 2013 13:26:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-many-homomorphisms-exist-between-znz-and-zmz <p>Today I&#39;ve wondered how many homomorphisms are between the groups <code>$(\mathbb{Z}/n\mathbb{Z},+)$</code> and <code>$(\mathbb{Z}/m\mathbb{Z},+)$</code> with <code>$m, n \geq 2$</code>. Does it make a difference if I use + or <code>$\cdot$</code> as operators?</p> <p>Let <code>$M := (\mathbb{Z}/m\mathbb{Z},+)$</code> and <code>$N := (\mathbb{Z}/n\mathbb{Z},+)$</code> be groups and <code>$\varphi: M \rightarrow N$</code> be a group homomorphism. Let <code>$H := \{\varphi: M \rightarrow N\}$</code></p> <p>Some fundamental theorems (which I&#39;m not going to prove) are: <ol class="roman"> <li><code>$\varphi(M)$</code> is a group.</li> <li><code>$K_\varphi := \{m \in M | \varphi(m) = e_N\}$</code> is a group.</li> <li><a href="http://en.wikipedia.org/wiki/Lagrange%27s_theorem_(group_theory)">Lagrange&#39;s theorem</a>: <code>$H \leq G \Rightarrow \#H | \# G$</code></li> <li><code>$\varphi(1)$</code> defines the complete homomorphism as <code>$\varphi(n) = \varphi(1 + (n-1)) = \varphi(1) + \varphi(n-1)$</code></li> <li><code>$\varphi(1) = 0$</code> is always a homomorphism (that maps everything to 0).</li> </ol></p> <h2>`$m = n$`</h2> <p><strong>Theorem</strong>: <code>$n=m \Rightarrow |H|=n$</code> <strong>Proof</strong>: You can map <code>$1$</code> to <code>$n$</code> values <code>$\stackrel{(IV)}{\Rightarrow}$</code> there can&#39;t be more than <code>$n$</code> homomorphisms.</p> <p>For every <code>$i \in \{0, \dots, n-1\}$</code> exists an homomorphism <code>$\varphi_i(1) = i$</code>: <code>$ \begin{align} \varphi(a) + \varphi(b) &amp;= (ai \mod n) + (bi \mod n)\\ &amp;= ai + bi \mod n\\ &amp;= (a+b)i \mod n\\ &amp;= \varphi(a+b) \end{align} $</code></p> <p>This means, that all of them are actually homomorphisms. For different <code>$i,j \in \{0, \dots, n-1\}$</code> the homomorphisms <code>$\varphi_i$</code> and <code>$\varphi_j$</code> are different. So we really have <code>$n$</code> homomorphisms <code>$\blacksquare$</code></p> <p>My first thought was that it&#39;s only a permutation, but <table> <tr><th><code>$m \in M$</code></th> <td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr> <tr><th><code>$\varphi(m) \in N$</code></th><td>0</td><td>3</td><td>0</td><td>3</td><td>0</td><td>3</td></tr> </table></p> <p>is not a permutation, but a homomorphism.</p> <h2>Distinct primes</h2> <p><strong>Theorem</strong>: <code>$n, m \in \mathbb{P}, n \neq m \Rightarrow |H| = 1$</code> <strong>Proof</strong>: </p> <p>Let <code>$n, m \in \mathbb{P}, n \neq m$</code>.</p> <p><u>Part 1</u>: <code>$1 \leq |H|$</code></p> <p>This follows directly from (V).</p> <p><u>Part 2</u>: <code>$|H| \leq 1$</code></p> <p>We know that <code>$\begin{align} \stackrel{(I)+(III)}{\Rightarrow} &amp;\# \varphi(M) | \# N\\ \stackrel{n \in \mathbb{P}}{\Rightarrow} &amp;\# \varphi(M) \in \{1, n\} \end{align}$</code></p> <p>and</p> <p><code>$\begin{align} \stackrel{(II)+(III)}{\Rightarrow} &amp;\# K_\varphi | \# M\\ \stackrel{m \in \mathbb{P}}{\Rightarrow} &amp;\# K_\varphi \in \{1, m\} \end{align}$</code></p> <p>Case 1: <code>$m &gt; n$</code></p> <p>Now the kernel can&#39;t be trivial anymore, so <code>$\# K_\varphi = m$</code>. This means that everything is mapped to 0. There is only one homomorphism that does so.</p> <p>Case 2: <code>$m &lt; n$</code></p> <p>Now the image <code>$\varphi(M)$</code> can&#39;t be all of <code>$N$</code>. This means <code>$\varphi(M) = 1$</code> which is again the 0-mapping <code>$\blacksquare$</code></p> <h2>Any `$n$` and `$m$`</h2> <p><strong>Theorem</strong>: <code>$|H| = gcd(n, m)$</code> <strong>Proof</strong>:</p> <p>First a sanity check: The theorems above are special cases of this theorem. Let&#39;s try to prove it.</p> <p>Let <code>$n$</code> be composed of primes <code>$p_1, \dots, p_x$</code> (where <code>$p_i = p_j$</code> is allowed). Then <code>$N = \mathbb{Z}/n\mathbb{Z} \cong \mathbb{Z}/p_1\mathbb{Z} \times \mathbb{Z}/p_2\mathbb{Z} \times \cdots \times \mathbb{Z}/p_x\mathbb{Z}$</code> according to the <a href="http://en.wikipedia.org/wiki/Chinese_remainder_theorem">Chinese remainder theorem</a>. The same is true for <code>$M$</code>. As there are <code>$p_i$</code> homomorphisms between <code>$\mathbb{Z}/p_i\mathbb{Z}$</code> and <code>$\mathbb{Z}/p_j\mathbb{Z}$</code> with <code>$p_i = p_j$</code> and as you can take a <code>$p_i$</code> from the left and a <code>$p_j$</code> from the right you can combine the different homomorphisms. So it is basically a combinatoric problem. As everything (except for same primes) will only have 1 homomorphism, you have to multiply the number of homomophisms for each pair <code>$(p_i, p_j)$</code>. But this is simply the gcd <code>$\blacksquare$</code></p> <h2>`$(\mathbb{Z}/n\mathbb{Z}, \cdot)$`</h2> <p>What changes when we use <code>$(\mathbb{Z}/n\mathbb{Z}, \cdot)$</code> and <code>$(\mathbb{Z}/m\mathbb{Z}, \cdot)$</code>?</p> <p>Well, first of all <code>$m$</code> and <code>$n$</code> have to be primes. Otherwise, not every element would have an inverse. Second, you have to exclude 0. Which means we only use units: </p> <p><code>$(\mathbb{Z}/n\mathbb{Z}, \cdot)^\times$</code> and <code>$(\mathbb{Z}/m\mathbb{Z}, \cdot)^\times$</code></p> <p>According to the German Wikipedia (<a href="http://de.wikipedia.org/wiki/Prime_Restklassengruppe">source</a>):</p> <blockquote>`$(\mathbb{Z}/n\mathbb{Z})^\times$` is cyclic `$:\Leftrightarrow n \in \{p^r, 2p^r | p \in \mathbb{P}, r \in \mathbb{N}_{\geq 1}\}$`</blockquote> <p>So there is no simple way to reduce it to the same proofs. But I&#39;ve created a little <a href="https://gist.github.com/MartinThoma/6353473">script that automatically finds homomorphisms</a>.</p> <h2>Related</h2> <ul> <li><a href="http://math.stackexchange.com/q/45663/6876">Quick way to find the number of the group homomorphisms ϕ:Z3&rarr;Z6?</a></li> </ul> Why is the stabilizer subgroup a subgroup? http://martin-thoma.com/stabilizer-subgroup-subgroup Mon, 26 Aug 2013 09:24:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/stabilizer-subgroup-subgroup <div class="definition">Let `$(G, \cdot)$` be a group and `$M$` a set. A <strong>group action</strong> is a function: `$G \circ M \rightarrow M$` that satisfies the following two conditions <ul> <li>Identity: `$\forall m \in M: e_G \circ m = m$`</li> <li>Associativity: `$\forall g, h \in G, m \in M: (g \cdot h) \circ m= g \circ (h \circ m)$`</li> </ul></div> <div class="definition">Let `$m \in M$`. Then `$G_m := \{g \in G | g \circ m = m\}$` is called the <strong>stabilizer</strong> of `$m$`.</div> <p><strong>Theorem</strong>: <code>$G_m$</code> is a group</p> <p><strong>Proof</strong>: </p> <p>Let <code>$m \in M$</code>.</p> <p><code>$\stackrel{identity}{\Rightarrow}e_G \in G_m$</code></p> <p>Let <code>$a \in G_m$</code>. This means, that <code>$a \circ m = m$</code>. And <code>$\exists a^{-1} \in G$</code>, as <code>$G$</code> is a group. <code>$a^{-1} \cdot a = e_G$</code>, this means <code>$(a^{-1} \cdot a) \circ m = m$</code>. <code>$\stackrel{associativity}{\Rightarrow}a^{-1} \circ (a \circ m) = m \Leftrightarrow a^{-1} \circ m = m \Leftrightarrow a^{-1} \in G_m$</code></p> <p>Let <code>$a, b \in G_m$</code>. Then: <code>$a \circ m = m$</code> and <code>$b \circ m = m$</code></p> <p><code>$\Rightarrow a \circ (b \circ m) = m$</code> <code>$\stackrel{associativity}{\Rightarrow} (a \cdot b) \circ m = m \Leftrightarrow (a \cdot b) \in G_m \blacksquare$</code></p> Why is the intersection of two normal subgroups a normal subgroup? http://martin-thoma.com/intersection-two-normal-subgroups-normal-subgroup Sun, 25 Aug 2013 16:04:56 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/intersection-two-normal-subgroups-normal-subgroup <p>Let <code>$(G, \cdot)$</code> be a group and <code>$X \lhd G$</code> and <code>$Y \lhd G$</code> be two normal subgroups.</p> <p>I will show this in two steps: <ol> <li>Show that <code>$X \cap Y$</code> is a group</li> <li>Show that <code>$X \cap Y$</code> is a normal group of <code>$(G, \cdot)$</code></li> </ol></p> <h2>Intersection of two subgroups is a subgroup</h2> <p><strong>Theorem</strong>: <code>$(X \cap Y) \leq G$</code> <strong>Proof</strong>:</p> <p><code>$X \cap Y$</code> is not empty: <code>$e_G \in X \land e_G \in Y \Rightarrow e_G \in (X \cap Y)$</code></p> <p><code>$X \cap Y$</code> has inverse elements. Let <code>$a \in (X \cap Y)$</code>. As a is in <code>$X$</code> and <code>$X$</code> is a group, <code>$a^{-1} \in X$</code>. The same is true for <code>$Y$</code>. So: <code>$\forall a \in (X \cap Y) \exists a^{-1} \in (X \cap Y): a \cdot a^{-1} = a^{-1} \cdot a = e_G$</code></p> <p><code>$\forall a,b \in (X \cap Y): a \cdot b^{-1} \in (X \cap Y)$</code>, because both, <code>$a$</code> and <code>$b^{-1}$</code> are in <code>$X$</code>. As <code>$X$</code> is a group, the result has to be in <code>$X$</code>. Same argumentation for <code>$Y$</code>. Then the result is in <code>$X$</code> and <code>$Y \blacksquare$</code></p> <h2>Intersection of two normal subgroups is normal</h2> <p>First the definition of a normal subgroup: <div class="definition">Let <code>$N \leq G$</code> be a subgroup of <code>$G$</code>.</p> <p><code>$N \lhd G :\Leftrightarrow \forall n \in N \forall g \in G: g \cdot n \cdot g^{-1} \in N$</code></div></p> <p><strong>Theorem</strong>: <code>$(X \cap Y) \lhd G$</code></p> <p><strong>Proof</strong>: </p> <p><code>$X \cap Y$</code> is a subgroup of <code>$G$</code> as I have proved above. </p> <p><code>$\forall n \in (X \cap Y) \forall g \in G: g \cdot n \cdot g^{-1} \in X$</code> and <code>$\forall n \in (X \cap Y) \forall g \in G: g \cdot n \cdot g^{-1} \in Y$</code></p> <p><code>$\Rightarrow \forall n \in (X \cap Y) \forall g \in G: g \cdot n \cdot g^{-1} \in (X \cap Y)$</code></p> <p><code>$\Rightarrow (X \cap Y) \lhd G \blacksquare$</code></p> How to analyze Mailman archives http://martin-thoma.com/how-to-analyze-mailman-archives Sun, 18 Aug 2013 19:23:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-analyze-mailman-archives <p>All mailing lists I use are <a href="http://en.wikipedia.org/wiki/GNU_Mailman">GNU Mailman</a> lists. This software provides archives of all Emails that were send over the list. </p> <p>They look like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/mailman-list-archive-300x277.png"><img src="../images/2013/08/mailman-list-archive-300x277.png" alt="" width="300" height="277" class="size-medium wp-image-76298"/></a><p class="wp-caption-text"></p></div></p> <p>Once in a while, I would like to search if a topic was already discussed. Here is how you can do it:</p> <h2>Download archives</h2> <div class="highlight"><pre><code class="bash">wget --save-cookies cookie.txt --post-data <span class="s1">&#39;username=user&amp;amp;password=pass&#39;</span> -A gz -m -p -E -k -K -np https://lists.abc.org/mailman/blub/ </code></pre></div> <h2>Rename archives</h2> <div class="highlight"><pre><code class="bash"><span class="k">for </span>file in *.txt.gz<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%.txt.gz}.txt&quot;</span><span class="p">;</span> <span class="k">done</span> </code></pre></div> <p>To make them sortable:</p> <div class="highlight"><pre><code class="bash"><span class="k">for </span>file in *January.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%January.txt}01.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *February.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%February.txt}02.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *March.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%March.txt}03.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *April.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%January.txt}04.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *May.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%May.txt}05.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *June.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%June.txt}06.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *July.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%July.txt}07.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *August.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%August.txt}08.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *September.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%September.txt}09.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *October.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%October.txt}10.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *November.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%November.txt}11.txt&quot;</span><span class="p">;</span> <span class="k">done</span> <span class="k">for </span>file in *December.txt<span class="p">;</span> <span class="k">do </span>mv <span class="s2">&quot;`$file&quot;</span> <span class="s2">&quot;$`{file%December.txt}12.txt&quot;</span><span class="p">;</span> <span class="k">done</span> </code></pre></div> <h2>Analyze them</h2> <p>To analyze the archives properly, you should perhaps first import all emails in a relational database. But with <code>grep</code> you could also do simple keyword searches.</p> Audible http://martin-thoma.com/audible Mon, 12 Aug 2013 22:58:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/audible <p>I have just decided to try Audible.de, the German part of <a href="http://en.wikipedia.org/wiki/Audible.com">Audible.com</a> which is &quot;An Amazon Company&quot;. They offer audiobooks. You have to know that I really like to listen to audiobooks when I can&#39;t read and need some distraction.</p> <p>Everybody who lives in Germany and buys something at Amazon knows the coupons that you get with a purchase: [gallery ids=&quot;76081,76071&quot;]</p> <h2>Buying audiobooks</h2> <p>Buying the audiobook I liked (&quot;Darknet&quot; from Daniel Suarez) was just as I knew it from Amazon. <span class="hint" title="Why the hell do they use another design?">Another design</span>, but even my bank account data is there. After purchasing it, I wanted to listen to it:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/bought-audio-book-300x166.png"><img src="../images/2013/08/bought-audio-book-300x166.png" alt="" width="300" height="166" class="size-medium wp-image-76101"/></a><p class="wp-caption-text"></p></div> <p>After clicking on &quot;my library&quot; I get to this page:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/audible-my-library-300x168.png"><img src="../images/2013/08/audible-my-library-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-76121"/></a><p class="wp-caption-text"></p></div> <p>A click on &quot;Start Audible-Assistant&quot; redirects to:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/assistant-software-download-300x168.png"><img src="../images/2013/08/assistant-software-download-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-76131"/></a><p class="wp-caption-text"></p></div> <p>So I thought I could download it to my smartphone.</p> <h2>Android App</h2> <p>If the <a href="https://play.google.com/store/apps/details?id=com.audible.application">Audible Android App</a> was software for your computer, you would call it spyware:</p> <ul> <li>It requires the permission to add or change calendar dates,</li> <li>send Emails to "guests" (whatever this means),</li> <li>pairing with Bluetooth devices,</li> <li>and some other stuff (which seems to be okay)</li> </ul> <p>Why the hell do they want to change my calendar dates? I only want to listen to audiobooks I&#39;ve bought...</p> <p>This is not okay for me, so lets see if I can listen to it on my computer.</p> <h2>Linux</h2> <p>As so often, there is no support for Linux. But <a href="http://appdb.winehq.org/objectManager.php?sClass=application&iId=1612">Wine</a> does a great job in bringing Windows applications to Linux. So I&#39;ve installed the software:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/audible-manager-300x168.png"><img src="../images/2013/08/audible-manager-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-76171"/></a><p class="wp-caption-text"></p></div> <p>I thought, maybe I need to activate it via the web interface. Back to image &quot;Software download assistant&quot;, click on &quot;Add device&quot; (the big orange button):</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/08/audible-assistant-300x168.png"><img src="../images/2013/08/audible-assistant-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-76191"/></a><p class="wp-caption-text"></p></div> <h2>My Email</h2> <p>There seems to be no way for me to download an audiobook with Audible. As it&#39;s now very late, I&#39;ve contacted customer service and described the issue (12.08.2013, 23:00):</p> <blockquote>Sehr geehrte Damen und Herren, wenn ich mein H&ouml;rbuch herunterladen will, werde ich darauf hingewiesen, dass ich noch kein Ger&auml;t hinzugef&uuml;gt habe. Wenn ich dann &uuml;ber den Link (http://www.audible.de/assistant) ein Ger&auml;t (meinen Linux-Computer auf dem der AudibleManager mit wine l&auml;uft) hinzuf&uuml;gen will, bekomme ich einen Fehler 404 (Seite nicht gefunden). Mit freundlichen Gr&uuml;&szlig;en, Martin Thoma</blockquote> <p>Answer:</p> <blockquote>Lieber Herr Thoma, vielen Dank f&uuml;r Ihr freundliches Schreiben. Es tut uns leid, tats&auml;chlich k&ouml;nnen wir unseren Service derzeit nicht auf Linux-Systemen anbieten. Ob es in Zukunft eine Unterst&uuml;tzung f&uuml;r Linux geben wird, k&ouml;nnen wir gegenw&auml;rtig leider nicht versprechen. Wir bitten um Ihr Verst&auml;ndnis. Wenn Sie den Manager bereits installiert haben und als Browser Firefox benutzen, dann sollten Sie das admhelper.adh Script mit dem AudibleDownloadHelper via wine &ouml;ffnen k&ouml;nnen. Wir hoffen, dass dies eine gute Alternative f&uuml;r Sie ist und stehen bei allen weiteren Fragen gerne zur Verf&uuml;gung. Ich w&uuml;nsche Ihnen einen wunderbaren Tag. Herzliche Gr&uuml;&szlig;e [A name which I don't want to show here.] Audible-Kundenservice</blockquote> <h2>Virtual Box</h2> <p>I&#39;ve finally got it to work. I&#39;ve installed XP with Virtual Box.</p> <h2>Cancellation</h2> <p>[gallery columns=&quot;4&quot; ids=&quot;76282,76283,76284,76285,76286,76287,76288,76289&quot;]</p> <h2>Conclusion</h2> <p><abbr title="Digital Rights Management">DRM</abbr> seems to be necessary for such a service. Okay, I want to get my free audiobook, so I have to accept this. But this one reason why the service SUCKS. It would be much easier to let the user download the audiobook as a simple MP3 / WAV / OGG file. Everybody can play these files. </p> <p>Do you want to install software for every service you want to purchase audiobooks / songs from? Please also consider that Amazon might close your account (<a href="http://www.faz.net/aktuell/finanzen/meine-finanzen/geld-ausgeben/nachrichten/amazon-sperrt-kunden-konten-angst-um-die-retoure-12315430.html">source</a>), so you can not simply stick with one provider.</p> <p>Currently, I can only say: Don&#39;t use audible. It&#39;s a terrible service.</p> Improving lecture notes: Job (almost) done! http://martin-thoma.com/improving-lecture-notes-job-almost-done Sat, 10 Aug 2013 13:50:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/improving-lecture-notes-job-almost-done <p>Some of you might know that I&#39;ve bin improving the lecture notes for the computer engineering lecture (digital electronics) since April 2013.</p> <h2>How I've got the job</h2> <p>This was kind of funny. I send Prof. Dr. Asfour some notes of passages that could be improved (mainly typos). About two days later he proposed me to correct it by myself. Another day later I signed the contract. I&#39;ve never signed a contract that fast.</p> <h2>What I did</h2> <p>My job was <ul> <li>to correct errors (German language, statements about computer science and LaTeX),</li> <li>find parts that were outdated and update them,</li> <li>find sections that were difficult to understand and simplify them and</li> <li>to make it easier to make changes in the future (Well, I don&#39;t think Prof. Dr. Asfour thought this was my job ... but I think it&#39;s important.)</li> </ul></p> <p>So Prof. Dr. Asfour created a SVN repository with all LaTeX sources of the latest lecture notes (which were already great!). He also sent me Emails he received from students who mentioned errors just like I did and some notes from a tutor who tried to improve the script some time ago.</p> <h2>Revisions</h2> <p>With <code>svn checkout svn://somepath@1 working-directory</code> you can checkout the first revision of a SVN repository. </p> <p>Total number of files and folders: <code>find . | wc -l</code> <ul> <li>Revision 1: 1885</li> <li>Revision 30: 1488</li> </ul></p> <p>How often did I change files: <code>svn log -qvr 1:HEAD|perl -nle &#39;print if /^Changed paths:/ ... /^-+$/ and /^\s/&#39; \ | sort | uniq -c | sort -n</code> (<a href="http://wirespeed.wordpress.com/2011/06/08/subversion-how-many-times-has-a-file-been-modified/">source</a>):</p> <div class="highlight"><pre><code class="bash"> 1 M /ti1.bib 2 M / 2 M /anhang-1.tex 2 M /anhang-3.tex 2 M /anhang-5.tex 2 M /diss-report.cls 2 M /figures/Makefile 2 M /titel.tex 2 M /zahlen_codes 3 M /vorwort.tex 7 M /einleitung.tex 8 M /Makefile 10 M /my_def.tex 11 M /sw.tex 14 M /arith.tex 14 M /skript.tex 16 M /daten.tex 19 M /sn.tex 22 M /README.txt 28 M /skript.pdf </code></pre></div> <p>With <a href="https://sourceforge.net/projects/codeanalyze-gpl/">CodeAnalyzer</a> over all .tex files: <table> <tr> <th>&nbsp;</th> <th>Revision 1</th> <th>Revision 30</th> </tr> <tr> <th>Total files</th> <td>31</td> <td>14</td> </tr> <tr> <th>Total Lines</th> <td>24,679</td> <td>11,077</td> </tr> <tr> <th>Avg Line Length</th> <td>39</td> <td>45</td> </tr> <tr> <th>Code Lines</th> <td>18,500</td> <td>8,967</td> </tr> <tr> <th>Comment Lines</th> <td>1,124</td> <td>871</td> </tr> <tr> <th>Whitespace Lines</th> <td>5,177</td> <td>1,391</td> </tr> <tr> <th>Resulting PDF pages</th> <td>229</td> <td>233</td> </tr> <tr> <th>Examples</th> <td>93 &lt;</td> <td>93</td> </tr> <tr> <th>Images</th> <td>211</td> <td>211</td> </tr> </table></p> <h2>StackExchange</h2> <p>I&#39;ve learned quite a lot about LaTeX while correcting the document. My questions on StackExchange might reflect that:</p> <ul> <li>xfig: <ul> <li><a href="http://tex.stackexchange.com/q/109388/5645">What are epic macro, eepic macro and eepicemu macro in xfig?</a></li> <li><a href="http://tex.stackexchange.com/questions/115773/setfigfontnfss-vs-setfigfont">SetFigFontNFSS vs. SetFigFont</a></li> </ul> </li> <li><a href="http://tex.stackexchange.com/q/117704/5645">Quotation marks: Is there any difference between \grqq/\glqq and &ldquo;` / &rdquo;'?</a></li> <li><a href="http://tex.stackexchange.com/q/117751/5645">How to use nag?</a> - This gave me a lot of input what I could improve</li> <li><a href="http://tex.stackexchange.com/q/121725/5645">How should I prevent images from floating between list and paragraph before</a></li> <li><a href="http://tex.stackexchange.com/q/125657/5645">Can I tell LaTeX to break a list?</a></li> <li><a href="http://tex.stackexchange.com/q/126790/5645">How can I prevent breaks in a custom environment?</a></li> <li><a href="http://tex.stackexchange.com/q/127561/5645">Is it possible to define an environment that might not be displayed?</a></li> <li><a href="http://stackoverflow.com/q/18158930/562769">Why doesn't grep give the matching line?</a></li> </ul> <p>And some language questions: <ul> <li><a href="http://german.stackexchange.com/q/7027/655">Nummerierung im Text</a></li> <li><a href="http://german.stackexchange.com/q/6589/655">Gibt es ein Verb f&uuml;r &ldquo;Ein Zeichen wird durch seine Escape-Sequenz ersetzt&rdquo;?</a></li> <li><a href="http://german.stackexchange.com/q/6154/655">&ldquo;Theoretische Informatik&rdquo; oder &ldquo;theoretische Informatik&rdquo;</a></li> </ul></p> <h2>What I've learned</h2> <ul> <li>You can open file skript.tex on line 1234 with <code>vim +1234 skript.tex</code></li> <li><code>grep -rniI</code>, <code>find</code>, <code>xargs</code>, make and <a href="http://en.wikipedia.org/wiki/Meld_(software)">Meld</a> are VERY useful</li> <li>I like Git more than SVN (because I don't need internet to commit)</li> <li>nag package is interesting</li> <li>There seems to be no good way to create images for digital electronics which might contain LaTeX. xfig is the best I found, but it is very hard to use.</li> </ul> <h2>Conclusion</h2> <p>Working as a &quot;Skript-HiWi&quot; is easy work, but more time consuming than you might think. Even if you know how to work with LaTeX. Rebuilding a big document takes some time.</p> <p>I was astonished that there were some topics which I didn&#39;t understand yet. After I&#39;ve prepared for the exam, I thought I knew everything in the lecture notes. Obviously, this was not the case (or I forgot how to do division with twos complement meanwhile).</p> Why everybody should know about conditional probability http://martin-thoma.com/why-everybody-should-know-about-conditional-probability Tue, 23 Jul 2013 13:37:39 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/why-everybody-should-know-about-conditional-probability <p>Probability theory is difficult, but I think everybody should be taught basics in this subject. Why? Because it is relevant for everybody.</p> <p>Suppose you go to the doctor to make a cancer test. The test is positive. That means you have cancer, right? Wrong!</p> <h2>Basics</h2> <p>A probability is a numerical value in [0, 1] that is assigned to events (or lets rather say outcomes of an experiment). A probability can never be less than zero and never be more than one.</p> <p>The sum of all probabilities of all outcomes of one experiment is always 1.</p> <p>Example: Your experiment <code>$x$</code> could be throwing a coin. The outcome of your experiment is either head or tails. So if <code>$Pr[x = \text{head}] = 0.6$</code>, then <code>$Pr[x = \text{tail}] = 0.4$</code>.</p> <p>Now you might argue that the coin can also stand on its border. This would result in a different model of the situation with different probabilities, e.g.:</p> <p><code>$Pr[x = \text{head}] = 0.559$</code>, <code>$Pr[x = \text{border}] = 0.001$</code> and <code>$Pr[x = \text{tail}] = 0.4$</code>.</p> <p>Another very important rule is Bayes rule:</p> <p><code>$Pr[A|B] = \frac{Pr[B|A] \cdot Pr[A]}{Pr[B]}$</code></p> <p>This works also with more variables:</p> <p><code>$Pr[A|BC] = \frac{Pr[B|AC] \cdot Pr[A|C]}{Pr[B|C]}$</code></p> <h2>Cancer</h2> <p>Lets say the probability of having cancer is <code>$Pr[C] = 0.01$</code>. This means the probability of not having cancer is <code>$Pr[\neg C] = 0.99$</code>.</p> <p>Now you have cancer tests. They can either be positive (+) which means they say you have cancer. Or they are negative (-), which means according to the test, you don&#39;t have cancer. </p> <p>They are not always working as expected. So you get so called &quot;false positives&quot; and &quot;false negatives&quot;.</p> <p>A false positive is a positive result, while it should be negative. So the test says you have cancer, while you don&#39;t have cancer. It is denoted by <code>$Pr[+ | \neg C] = 0.2$</code>.</p> <p>A false negative is a negative result, while it should be positive. So the test says you don&#39;t have cancer, but you actually have cancer. It is denoted by <code>$Pr[- | C] = 0.1$</code>.</p> <p>You should note that <code>$Pr[+ | \neg C] + Pr[- | C] = 0.2 + 0.1 = 0.3 \neq 1$</code>. Why is this the case? Because the test might also not be related at all to you having cancer.</p> <p>But <code>$Pr[+ | \neg C] + Pr[- | \neg C]$</code> has to be 1 and <code>$Pr[+ | C] + Pr[- | C]$</code> also has to be one.</p> <p>So you can draw this table:</p> <table class="wikitable" style="width:auto;"> <tr> <th>`$Pr[\text{Testresult}|\text{Cancer}]$`</th> <th>`$C$`</th> <th>`$\neg C$`</th> </tr> <tr> <th>`$+$`</th> <td style="background-color:lime;">`$0.9$`</td> <td style="background-color:red;">`$0.2$`</td> </tr> <tr> <th>`$-$`</th> <td style="background-color:red;">`$0.1$`</td> <td style="background-color:lime;">`$0.8$`</td> </tr> </table> <p>You can see that the correct results are much more likely than the wrong ones.</p> <h2>Some intermediate results</h2> <p>How likely is a positive / negative test result? <code>$\begin{align} Pr[+] &amp;= Pr[+|C] \cdot Pr[C] + Pr[+| \neg C] \cdot Pr[\neg C] = 0.207\\ Pr[-] &amp;= Pr[-|C] \cdot Pr[C] + Pr[-| \neg C] \cdot Pr[\neg C] = 0.793 \end{align}$</code></p> <p>How likely are the combinations? (This time you don&#39;t know if you have cancer):</p> <table class="wikitable" style="width:auto;"> <tr> <th>`$Pr[\text{Testresult}, \text{Cancer}]$`</th> <th>`$C$`</th> <th>`$\neg C$`</th> </tr> <tr> <th>`$+$`</th> <td>`$0.009$`</td> <td>`$0.198$`</td> </tr> <tr> <th>`$-$`</th> <td>`$0.001$`</td> <td>`$0.792$`</td> </tr> </table> <h2>Reversing it</h2> <p>It is quite likely that you would like to know how likely it is that you have cancer. Without a test, you know:</p> <p><code>$\begin{align} Pr[C] &amp;= 0.01\\ Pr[\neg C] &amp;= 0.99 \end{align}$</code></p> <p>Now you get a positive test result. How likely is it that you have cancer? In other words: Calculate <code>$Pr[C|+]$</code></p> <p><code>$\begin{align} Pr[C|+] &amp;= \frac{Pr[C, +]}{Pr[+]} = \frac{0.009}{0.207} = \frac{1}{23} \approx 0.043\\ Pr[\neg C|+] &amp;= 1 - \frac{1}{23} = \frac{22}{23} \approx 0.957\\ Pr[C|-] &amp;= \frac{0.001}{0.793} = \frac{1}{793} \approx 0.001\\ Pr[\neg C|-] &amp;= 1 - \frac{1}{793} = \frac{792}{793} \approx 0.999 \end{align}$</code></p> <p>How would you interpret these results? I&#39;d say: When you get a positive result you shouldn&#39;t really worry. But perhaps you should make other tests. When you get a negative results you can be very sure that you don&#39;t have cancer.</p> <h2>Testing again</h2> <p>A very natural approach to a positive test result might be taking the same test again. How does this influence the probability?</p> <p>There are four possibilities what could have happened: <ul> <li>You have cancer: <ul> <li>Second test was negative</li> <li>Second test was positive</li> </ul> </li> <li>You don&#39;t have cancer: <ul> <li>Second test was negative</li> <li>Second test was positive</li> </ul> </li> </ul></p> <p>First of all, I compare some intermediate results <code>$ \begin{align} Pr[++] &amp;= Pr[C] \cdot Pr[+|C] \cdot Pr[+|C] + Pr[\neg C] \cdot Pr[+|\neg C] \cdot Pr[+|\neg C]\\ &amp;= 0.477 \neq 0.042849 = 0.207^2 = (Pr[+])^2\\ Pr[+-] &amp;= Pr[C] \cdot Pr[+|C] \cdot Pr[-|C] + Pr[\neg C] \cdot Pr[+|\neg C] \cdot Pr[-|\neg C] \\ &amp;= 0.01 \cdot 0.9 \cdot 0.1 + 0.99 \cdot 0.2 \cdot 0.8\\ &amp;= 0.1593\\ Pr[C,+,+] &amp;= Pr[C] \cdot Pr[+ | C]^2 = 0.01 \cdot 0.9^2 = 0.0081\\ Pr[C,+,-] &amp;= Pr[C] \cdot Pr[+ | C] \cdot Pr[-|C] = 0.01 \cdot 0.9 \cdot 0.1 = 0.0009\\ Pr[C|++] &amp;= \frac{Pr[C,+,+]}{Pr[++]} = \frac{0.0081}{0.207^2} = \frac{9}{530} \approx 0.170\\ Pr[C|+-] &amp;= \frac{Pr[C,+,-]}{Pr[+-]} = \frac{0.0009}{0.1593} = \frac{1}{177} \approx 0.006 \end{align} $</code></p> <p>Woooha! So if one test says you have cancer, don&#39;t worry. When two tests say you have cancer, you have a 17% chance of having cancer.</p> <p>On the other hand: One negative and one positive test is better than no test at all, because without a test you have a probability of 0.01 to have cancer. With both tests, you only have a probability of 0.006.</p> <h2>Why probability is important for you</h2> <p>As you might have seen, your intuition about probability is wrong. But we hear numbers all the time. It is important for us to understand them, so we should drop our intuition and learn how to use those numbers.</p> Kollisionsresistente Hashfunktionen und Einwegfunktionen http://martin-thoma.com/kollisionsresistente-hashfunktionen-und-einwegfunktionen Tue, 23 Jul 2013 08:05:24 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/kollisionsresistente-hashfunktionen-und-einwegfunktionen <h2>Definitionen</h2> <div class="definition"> Sei `$f:X \rightarrow Y$` eine Funktion. `$f$` hei&szlig;t eine Einwegfunktion, genau dann wenn f&uuml;r alle `$x \in X$` gilt: <ul> <li>`$y := f(x)$` kann in Polynomialzeit berechnet werden</li> <li>F&uuml;r die Berechnung eines Urbildes `$x$` aus `$y$` existiert kein randomisierter Algorithmus, der in Polynomialzeit l&auml;uft.</li> </ul> </div> <div class="definition"> Eine Funktion `$H:\{0,1\}^* \rightarrow \{0,1\}^k$` hei&szlig;t <strong>kollisionsresistente Hashfunktion</strong>, wenn gilt: Jeder effiziente Algorithmus findet nur mit kleiner Wahrscheinlichkeit eine Kollision. </div> <p>Was hei&szlig;t &bdquo;kleine Wahrscheinlichkeit&ldquo;? Nach dem Auswerten der Funktion <code>$H$</code> f&uuml;r <code>$x_1, x_2, \dots x_n$</code> sollte die Wahrscheinlichkeit nicht signifikant h&ouml;her sein als <code>$\displaystyle 1-\frac{n!\cdot{{2^k} \choose n}}{{2^k}^n}$</code> Diese Wahrscheinlichkeit kommt von dem <a href="http://de.wikipedia.org/wiki/Geburtstagsparadoxon">Geburtstagsparadoxon</a> bzw. dem <a href="http://de.wikipedia.org/wiki/Schubfachprinzip">Schubfachprinzip</a>. Wir haben <code>$2^k$</code> Schubf&auml;cher (Funktionswerte) in die wir die <code>$x_i$</code> (Urbilder) einordnen k&ouml;nnen.</p> <h2>Satz</h2> <p><strong>Behauptung</strong>: Jede kollisionsresistente Hashfunktion ist eine Einwegfunktion. <strong>Beweis</strong>: durch Widerspruch Sei <code>$f$</code> eine kollisionsresistente Hashfunktion <u>Annahme</u>: <code>$f$</code> ist keine Einwegfunktion</p> <p>Dann existiert ein Angreifer <code>$\mathcal{A}$</code>, der f&uuml;r eine Bild <code>$f(x)$</code> ein <code>$x&#39;$</code> findet, sodass <code>$f(x) = f(x&#39;)$</code> gilt.</p> <p>Der Angreifer <code>$\mathcal{B}$</code> macht nichts anderes, als zuf&auml;llig Werte <code>$x \in \{0,1\}^{2k}$</code> zu w&auml;hlen, <code>$f(x)$</code> zu berechnen, den Angreifer <code>$\mathcal{A}$</code> auf <code>$f(x)$</code> anzuwenden und zu &uuml;berpr&uuml;fen, ob das von <code>$\mathcal{A}$</code> gelieferte <code>$x&#39; \neq x$</code> ist. Sobald das ein mal der Fall ist, hat der Angreifer gewonnen.</p> <p>Nun wenden wir <code>$f$</code> auf <code>$x \in \{0,1\}^{2k}$</code> an. Es gilt:</p> <p><code>$Pr_x[\underbrace{|f^{-1}(f(x))|}_{\substack{\text{Anzahl der Urbilder}\\\text{zum Hashwert} f(x)} } = 1] \leq \frac{2^k}{2^{2k}} = \frac{1}{2^k}$</code>.</p> <p>Die <code>$2^k$</code> im Z&auml;hler stehen f&uuml;r die Funktionswerte und die <code>$2^{2k}$</code> f&uuml;r die Urbilder.</p> <p>Nun ist <code>$\frac{1}{2^k}$</code> eine vernachl&auml;ssigbare Funktion.</p> <p><code>$\Rightarrow$</code> Die Wahrscheinlichkeit, dass wir keine Kollsion finden ist vernachl&auml;ssigbar.</p> <p><code>$\Rightarrow$</code> Mit signifikanter Wahrscheinlichkeit hat <code>$f(x)$</code> <code>$k \geq 2$</code> Urbilder.</p> <p><code>$\Rightarrow$</code> Die Wahrscheinlichkeit, dass <code>$\mathcal{B}$</code> Kollisionen findet ist etwa <code>$(1-\frac{1}{k}) \cdot m$</code>, wobei <code>$m$</code> die Anzahl der Widerholungen ist.</p> Signs that it is too hot outside http://martin-thoma.com/signs-that-it-is-too-hot-outside Mon, 22 Jul 2013 20:59:13 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/signs-that-it-is-too-hot-outside <p>[gallery ids=&quot;74781,75651&quot;]</p> <h2>See also</h2> <ul> <li><a href="http://www.pleated-jeans.com/2013/07/02/20-signs-its-too-freaking-hot-outside/">20 Signs It&rsquo;s Too Freaking Hot Outside</a> - As a <a href="http://imgur.com/2XQla6k">single image on imgur.com</a></li> <li><a href="http://imgur.com/gallery/bOIHj">Another image</a></li> </ul> Simquadrat http://martin-thoma.com/simquadrat Sun, 21 Jul 2013 16:18:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/simquadrat <p>Simquadrat ist ein Dienst von <a href="http://en.wikipedia.org/wiki/Sipgate">sipgate</a>. Das besondere daran ist, dass Simkarten verkauft werden, die eine Festnetznummer haben. Ich habe das ganze ausprobiert und will meine Erfahrungen nun teilen.</p> <h2>Das Angebot</h2> <p>Man geht auf <a href="https://www.simquadrat.de/">simquadrat.de</a>, bezahlt 4,95 Euro und bekommt eine <strong>Festnetznummer</strong> des Ortes, f&uuml;r den man die Postadresse angibt. Die meisten Leute, die ich kennen haben eine Festnetz-Flat. Das bedeutet, sie k&ouml;nnen mich kostenlos auf dem Handy anrufen. Toll, oder?</p> <p>Es ist ein <strong>Prepaid</strong>-Service. Das hei&szlig;t, ich habe ein Guthaben, das ich vertelefonieren kann. Wenn das Guthaben weg ist, kann ich nicht mehr telefonieren. Das hat f&uuml;r mich vor allem den Vorteil, dass es keine versteckten Kosten gibt (bzw. diese micht nicht so hart treffen).</p> <p>F&uuml;r <strong>10 Euro</strong> bekommt man eine <strong>1-Monat-Festnetzflat</strong>.</p> <h2>Die Bestellung</h2> <p>Die Bestellung auf <a href="https://www.simquadrat.de/signup">simquadrat.de</a> ist extrem einfach. </p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/simquadrat-bestellung-300x168.png"><img src="../images/2013/07/simquadrat-bestellung-300x168.png" alt="" width="300" height="168" class="size-medium wp-image-74541"/></a><p class="wp-caption-text"></p></div> <p>Nach drei Schritten ist man wirklich fertig. Die beiden Emails, die man dann bekommt, sind auch sch&ouml;n kurz:</p> <p>[gallery columns=&quot;2&quot; ids=&quot;74551,74561&quot;]</p> <p>Nach wenigen Tagen ist dann die Simkarte angekommen:</p> <p>[gallery link=&quot;file&quot; ids=&quot;74571,74581,74591&quot;]</p> <p>Wie man sieht, bekommt man eine Simkarte, wo man sich die richtige Gr&ouml;&szlig;e herausbrechen kann. Micro- und Mini-Simkarten gehen also (bei Nano-Sim f&uuml;rs iPhone bin ich mir nicht sicher, aber ich glaube auch das konnte man angeben).</p> <h2>Der Dienst</h2> <p>Simquadrat hat sofort funktioniert. Ich konnte telefonieren und SMS schreiben (die aber nicht bei meiner Freundin angekommen sind ... aber das k&ouml;nnte auch gut an ihrem Handy/Anbieter liegen). Auch die Online-Benutzeroberfl&auml;che ist gut:</p> <div style="width: 261px" class="wp-caption aligncenter"><a href="../images/2013/07/simquadrat-eingeloggt-261x300.png"><img src="../images/2013/07/simquadrat-eingeloggt-261x300.png" alt="" width="261" height="300" class="size-medium wp-image-74601"/></a><p class="wp-caption-text"></p></div> <p>ABER: Die <strong>Telefonqualit&auml;t ist unterirdisch</strong>. Ich erwarte, dass der Zugangsanbieter mein Gespr&auml;ch in so guter Qualit&auml;t &uuml;bertr&auml;gt, wie es mein Handy unterst&uuml;tzt. Mit Simyo ist die Qualit&auml;t genauso gut wie &uuml;ber das Festnetz-Telefon. Laut prepaid-wiki nutzt Simquadrat wie Simyo das E-Plus-Netz. Ich habe mit meiner Freundin mit meinem Nexus 4 am selben Tag (mit einem Abstand von 10 Minuten f&uuml;r dem Simkartenwechsel) einmal mit Simyo und einmal mit Simquadrat telefoniert. Das ist, im Bezug auf die Qualit&auml;t der Sprach&uuml;bertragung, ein himmelweiter Unterschied.</p> <h2>Fazit</h2> <p>Wenn man sehr g&uuml;nstig in Deutschland erreichbar sein will, ist Simquadrat super. Sonst ist Simyo besser.</p> DNS-Services http://martin-thoma.com/dns-services Sat, 20 Jul 2013 12:46:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/dns-services <p>I&#39;ve just read (ok, now it&#39;s over 3 months ago) that <a href="http://en.wikipedia.org/wiki/Google_Public_DNS">Google Public DNS</a> now supports DNSSEC (<a href="http://googleonlinesecurity.blogspot.de/2013/03/google-public-dns-now-supports-dnssec.html">source</a>).</p> <p>I was curious what I currently use on my Linux Mint 14 machine. The relevant file is <strong>/etc/resolv.conf</strong>:</p> <div class="highlight"><pre><code class="text">nameserver 127.0.1.1 # OpenDNS Fallback (configured by Linux Mint in /etc/resolvconf/resolv.conf.d/tail). nameserver 208.67.222.222 nameserver 208.67.220.220 </code></pre></div> <h2>namebench</h2> <p>A programm called <a href="https://code.google.com/p/namebench">namebench</a> checks how fast several DNS configurations would be for you.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/namebench-300x222.png"><img src="../images/2013/03/namebench-300x222.png" alt="" width="300" height="222" class="size-medium wp-image-62241"/></a><p class="wp-caption-text"></p></div> <h2>Further reading</h2> <ul> <li><a href="http://wiki.ubuntuusers.de/Dnsmasq">Dnsmasq</a> (German)</li> <li><a href="http://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution">Debian manual - The hostname resolution</a>: explains where 127.0.1.1 comes from</li> </ul> SQL Injections http://martin-thoma.com/sql-injections Thu, 11 Jul 2013 17:25:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sql-injections <p><abbr title="Structured Query Language">SQL</abbr> is a language that allows prorammers to access data in databases. Most of the time (always?) you pass your queries in form of strings to the database. In online services it is quite common that the programmer formulates a template and the user fills in variables. </p> <h2>Example: IMDb</h2> <p>Take a look at <a href="http://www.imdb.com/">IMDb</a>. Users can search for movies by title:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/imdb-harry-potter-query-300x194.png"><img src="../images/2013/07/imdb-harry-potter-query-300x194.png" alt="" width="300" height="194" class="size-medium wp-image-73911"/></a><p class="wp-caption-text"></p></div> <p>When you search for &quot;Harry Potter&quot; for example, the following happens:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/imdb-search-query-300x156.png"><img src="../images/2013/07/imdb-search-query-300x156.png" alt="" width="300" height="156" class="size-medium wp-image-73921"/></a><p class="wp-caption-text"></p></div> <p>You obviously interacted with imdb.com in a very dynamic way. The output of the website depends on what you typed in and IMDb has to search in its database for your search terms.</p> <p>The programmers might have created a query that looks like this</p> <p>[sql]SELECT * FROM <code>movie</code> WHERE title=`$_GET[&#39;q&#39;][/sql]</p> <p>Where <code>$`_GET[&#39;q&#39;]</code> is your query.</p> <h2>Proof of concept</h2> <p>You need: <ul> <li>Apache Web Server</li> <li>PHP</li> <li>MySQL</li> <li>PhpMyAdmin (for convenience)</li> </ul></p> <p>When you search for &quot;LAMP&quot; (for Linux users) or for &quot;WAMP&quot; (for Windows users) you find a lot of information how to install this.</p> <p>Place the following as <code>hack.php</code> in your web servers directory (might be <code>/var/www</code>):</p> <p>[php] &lt;? <code>$mysqlhost = &quot;localhost&quot;; $</code>mysqluser = &quot;root&quot;; <code>$mysqlpwd = &quot;asdfasdf&quot;; $</code>connection = mysql<em>connect(<code>$mysqlhost, $</code>mysqluser, <code>$mysqlpwd) or die (&quot;Your connection string was wrong&quot;); $</code>db</em>selected = mysql<em>select</em>db(&#39;imdb&#39;, `$connection);</p> <p>$<code>q =</code>$<em>GET[&#39;q&#39;]; if ($<code>q != &quot;&quot;) { </code>$result = mysql</em>query(&quot;SELECT * FROM <code>movies</code> WHERE title=&#39;$<code>q&#39;&quot;); if (!</code>$result) { die(&#39;MySQL query error: &#39; . mysql<em>error()); } echo &quot;Found &quot;.mysql</em>num<em>rows($<code>result).&quot; movies:&lt;br/&gt;&quot;; while (</code>$row = mysql</em>fetch_assoc($<code>result)) { echo</code>$row[&quot;id&quot;].&quot;: &quot;.$`row[&quot;title&quot;].&quot;<br/>&quot;; } } ?&gt;</p> <form method="get" action="hack.php"> <input type="text" name="q"/> <input type="submit" /> </form> <p>[/php]</p> <p>Now create a database called <code>imdb</code> with PHPMyAdmin and execute the following SQL:</p> <p>[sql] CREATE TABLE IF NOT EXISTS <code>movies</code> ( <code>id</code> int(11) NOT NULL AUTO<em>INCREMENT, <code>title</code> varchar(255) NOT NULL, PRIMARY KEY (<code>id</code>) ) AUTO</em>INCREMENT=4;</p> <p>INSERT INTO <code>movies</code> (<code>id</code>, <code>title</code>) VALUES (1, &#39;Harry Potter&#39;), (2, &#39;Lord of the Rings&#39;), (3, &#39;Rise of the Silver Surfer&#39;);</p> <p>CREATE TABLE IF NOT EXISTS <code>users</code> ( <code>id</code> int(11) NOT NULL AUTO<em>INCREMENT, <code>username</code> varchar(255) NOT NULL, <code>password</code> varchar(32) NOT NULL, <code>email</code> varchar(255) NOT NULL, PRIMARY KEY (<code>id</code>) ) AUTO</em>INCREMENT=3 ;</p> <p>INSERT INTO <code>users</code> (<code>id</code>, <code>username</code>, <code>password</code>, <code>email</code>) VALUES (1, &#39;admin&#39;, &#39;qewrtqwert&#39;, &#39;admin@imdb.com&#39;), (2, &#39;user&#39;, &#39;secret&#39;, &#39;mylittlepony@stupid.com&#39;); [/sql]</p> <p>Now go to <a href="http://localhost/hack.php">http://localhost/hack.php</a>. It should look like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/hack-screenshot-300x85.png"><img src="../images/2013/07/hack-screenshot-300x85.png" alt="" width="300" height="85" class="size-medium wp-image-73971"/></a><p class="wp-caption-text"></p></div> <p>When you search for &quot;Harry Potter&quot; it should show you &quot;1: Harry Potter&quot;. Note that there could be a lot of information, but I wanted to keep this example as small as possible.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/hack-normal-use-300x77.png"><img src="../images/2013/07/hack-normal-use-300x77.png" alt="" width="300" height="77" class="size-medium wp-image-73981"/></a><p class="wp-caption-text"></p></div> <p>This resulted in the following query:</p> <p>[sql]SELECT * FROM <code>movies</code> WHERE title=&#39;Harry Potter&#39;[/sql]</p> <p>But a Hacker could also enter a string like this: <code>&#39; OR &#39;1&#39;=&#39;1</code>:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/hack-hacky-use-300x94.png"><img src="../images/2013/07/hack-hacky-use-300x94.png" alt="" width="300" height="94" class="size-medium wp-image-73991"/></a><p class="wp-caption-text"></p></div> <p>Even worse, the attacker could know that you use MySQL. Then he might know that MySQL uses <a href="http://dev.mysql.com/doc/refman/5.1/en/information-schema.html">INFORMATION_SCHEMA tables</a>. He might enter this into the title input element:</p> <p>[sql]&#39; UNION SELECT table<em>name, table</em>type FROM information_schema.tables WHERE &#39;1&#39;=&#39;1[/sql]</p> <p>which results in this query:</p> <p>[sql]SELECT * FROM <code>movies</code> WHERE title=&#39;&#39; UNION SELECT table<em>name, table</em>type FROM information_schema.tables WHERE &#39;1&#39;=&#39;1&#39;[/sql]</p> <p>which gives:</p> <div style="width: 268px" class="wp-caption aligncenter"><a href="../images/2013/07/sql-injection-example-268x300.png"><img src="../images/2013/07/sql-injection-example-268x300.png" alt="" width="268" height="300" class="size-medium wp-image-74001"/></a><p class="wp-caption-text"></p></div> <p>This way, the attacker gets all table names from all databases on this machine. So he essentially can get everything stored in your database. And, of course, after getting everything he could drop it:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/07/exploits_of_a_mom-300x92.png"><img src="../images/2013/07/exploits_of_a_mom-300x92.png" alt="" width="300" height="92" class="size-medium wp-image-74011"/></a><p class="wp-caption-text"></p></div> <h2>History</h2> <p>Just a few famous examples to show you that this happens all the time:</p> <ul> <li>2005: USC admissions page (<a href="http://www.theregister.co.uk/2005/07/06/usc_site_cracked/">source</a>)</li> <li>2006: 800,000 datasets of personal information of students of UCLA (<a href="http://www.schneier.com/blog/archives/2006/12/major_privacy_b_1.html">source</a>)</li> <li>2008, 2009: Heartland Payment Systems; 130 million credit and debit cards (<a href="http://www.zdnet.com/blog/government/gonzales-just-tip-of-iceberg-in-heartland-attack/5252">source 1</a>, <a href="http://www.computerworld.com.au/article/315418/sql_injection_attacks_led_massive_data_breaches/">source 2</a>, see <a href="http://en.wikipedia.org/wiki/Albert_Gonzalez">Albert Gonzalez</a>)</li> <li>2010: Royal Navy Website; Passwords and Usernames stolen (<a href="http://www.eweek.com/c/a/Security/Hacker-Hits-British-Navy-Website-With-SQL-Injection-Attack-108377/">source</a>)</li> <li>2011: Sony: <blockquote>LulzSec says it accessed the passwords, email addresses, home addresses and dates of birth of one million users. The group says it also stole all admin details of Sony Pictures, including passwords. 75,000 music codes and 3.5 million music coupons were also accessed, according to the press release.</blockquote> (<a href="http://www.thewhir.com/web-hosting-news/hackers-attack-sony-pictures-with-single-sql-injection">source</a>)</li> <li>2011: Expedia (<a href="http://www.eweek.com/c/a/Security/Expedias-TripAdvisor-Member-Data-Stolen-in-Possible-SQL-Injection-Attack-522785/">source</a>)</li> <li>2011: MySql - Usernames and passwords stolen (<a href="http://www.infoworld.com/d/security/mysql-website-falls-victim-sql-injection-attack-155886">source 1</a>, <a href="http://seclists.org/fulldisclosure/2011/Mar/309">source 2</a>)</li> <li>2011: Comodo (<a href="http://www.infosecurity-magazine.com/view/18265/another-comodo-partner-attacked-using-sql-injection/">source 1</a>, <a href="http://www.heise.de/security/meldung/Erneut-Comodo-SSL-Registrar-gehackt-1250208.html">source 2</a>)</li> </ul> <h2>Solutions</h2> <ul> <li>Sanitize user input, e.g. with <a href="http://de2.php.net/mysql_real_escape_string">mysql_real_escape_string</a></li> <li>Use <a href="http://php.net/manual/en/pdo.prepared-statements.php">prepared statements</a></li> <li>Switch of <a href="http://php.net/manual/en/function.error-reporting.php">error reporting</a> (this makes attacks more difficult, but doesn't prevent them)</li> </ul> <h2>See also</h2> <ul> <li><a href="../challenge-websites/">Challenge Websites</a>: Try if you can write SQL injections yourself :-)</li> </ul> Medion Life MD 83962 E69229 http://martin-thoma.com/medion-life-md-83962-e69229 Tue, 09 Jul 2013 21:34:51 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/medion-life-md-83962-e69229 <p>Momentan kann man <a href="http://www.medion.com/de/prod/Lautsprecher+mit+Bluetooth+Funktion+MEDION%C2%AE+LIFE%C2%AE+E69229+(MD+83962)/50043426A1">diese Blootooth</a> Lautsprecher f&uuml;r 30 Euro bei Aldi kaufen:</p> <p>[gallery columns=&quot;2&quot; ids=&quot;73691,73701,73711,73721&quot;]</p> <p>Ich habe sie mir angeschaut, bin aber entt&auml;uscht. Wenn ich sie per Bluetooth an mein Nexus 4 anschlie&szlig;e gibt es h&auml;ssliche Ger&auml;usche von sich. Au&szlig;erdem ist die Audio-Qualit&auml;t nicht so toll und die Freisprechfunktion ist ... naja. Deutlich schechter als das interne Micro, wenn ich direkt zur Box rede.</p> <p>Um euch mal einen Vergleich zu geben, habe ich die ersten zwei Minuten des Open Movie &quot;Bick Buck Bunny&quot; mit meinem Nexus 4 aufgenommen. Bei der ersten Aufnahme h&ouml;rt man die erste 2 Minuten durch meine internen Notebook-Lautsprecher, bei der zweiten durch den Medion Life MD 83962 Lautsprecher (per Kabel mit dem Notebook verunden): <ul> <li><a href="../images/2013/07/medion-md-83962.wav">Medion MD 83962: Bluetooth speakers</a></li> <li><a href="../images/2013/07/acer-travelmate-5744z.wav">Acer Travelmate 5744Z: Internal Speakers</a></li> </ul></p> <p>Hier h&ouml;rt man keinen gro&szlig;en Unterschied. Aber die internen Lautsprecher meines Acer Travelmate 5744Z h&ouml;ren sich besser an als der Bluetooth-Lautsprecher. Und das Micro ist wie gesagt ziemlich schlecht. Ich kann also definitiv keine Kaufempfehlung geben.</p> <p>Die Ma&szlig;e sind &uuml;brigens: 16,5 cm x 7,0 cm x 7,3 cm (Breite x Tiefe x H&ouml;he).</p> Data Backup Strategies http://martin-thoma.com/data-backup-strategies Mon, 08 Jul 2013 06:48:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/data-backup-strategies <p>Yesterday, I thought what would happen if my internal or external hard drive crashed. </p> <p>The hard disk of this computer contains 53 GB of data (on Linux: <code>df -H</code>). As my home folder only contains 35.3 GB of data, 17.7 GB seem to be programs. 21.1 GB the remaining data is for movies and 6.1 GB are for programming (and backed up via GitHub). Hence the by far biggest part of the lost data would be movies, the rest would be scattered across my home folder. </p> <p>The situation is similar for my external hard drive: A lot of video files, some audio files, A LOT of pictures and many, many miscellaneous files. I don&#39;t want to lose data, but I don&#39;t use my external HDD often. Most of the time I only have to do a <abbr title="regular expression">RegEx</abbr> search for file names (sometimes also a full text search for some files I found via RegEx) just to find out that the file I&#39;m looking for is not there.</p> <h2>Online Services</h2> <p>I want to back up one computer with at least 200 GB which I don&#39;t need to access often and 10 GB that need to access often.</p> <p>A backup service should include software, that ... <ul> <li>... allows me to configurate upload / dowload bandwidth limts</li> <li>... should integrate into my <abbr title="operating system">os</abbr> in such a way that it feels like using a hard disk</li> <li>... lets me upload files of sizes up to 5 GB</li> <li>... uploads in background automatically as soon as my notebook gets an internet connection</li> <li>... uploads only parts of files, if only parts changed</li> <li>... starts uploading as soon as a file changed</li> <li>... creates checksums and compares them to check if files were correctly uploaded</li> </ul></p> <p>A version control would be great, but that&#39;s a feature I don&#39;t expect. Also a possibility to share content (single files with a code) would be great, but I don&#39;t know if any of those services offers that.</p> <table> <tr> <th>Name</th> <th>Euro / Year</th> <th>&nbsp;</th> <th>Free trial</th> <th>Clients</th> <th>Information</th> </tr> <tr> <td><a href="http://www.backblaze.com/">Backblaze</a></td> <td style="text-align:right;"><a href="http://www.backblaze.com/de_DE/online-backup-about.html">37.06</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /></td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/Backblaze">Wiki</a></td> </tr> <tr> <td><a href="http://www.carbonite.com/">Carbonite</a></td> <td style="text-align:right;"><a href="http://www.carbonite.com/online-backup/pricing-plans">46.78</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/Carbonite_(online_backup)">Wiki</a></td> </tr> <tr> <td><a href="http://www.crashplan.com/">CrashPlan</a></td> <td style="text-align:right;"><a href="http://www.crashplan.com/consumer/compare.html">46.78</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/tux.png" alt="Tux - Icon" width="16" height="16" class="size-full wp-image-73301" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/Crashplan#CrashPlan">Wiki</a></td> </tr> <tr> <td><a href="https://www.idrive.com/index.html">IDrive</a></td> <td style="text-align:right;"><a href="https://www.idrive.com/pricing.htm">116.58</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/tux.png" alt="Tux - Icon" width="16" height="16" class="size-full wp-image-73301" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td>-</td> </tr> <tr> <td><a href="https://www.jungledisk.com/">Jungle Disk</a></td> <td style="text-align:right;"><a href="https://www.jungledisk.com/personal/desktop/pricing/">238.62</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /></td> <td><img src="../images/2013/07/tux.png" alt="Tux - Icon" width="16" height="16" class="size-full wp-image-73301" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> ?</td> <td><a href="http://en.wikipedia.org/wiki/Jungle_Disk">Wiki</a></td> </tr> <tr> <td><a href="http://www.mimedia.com/">MiMedia</a></td> <td style="text-align:right;"><a href="http://www.mimedia.com/more-space/">77.20</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td>? <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/MiMedia">Wiki</a></td> </tr> <tr> <td><a href="http://mozy.com/">Mozy</a></td> <td style="text-align:right;"><a href="http://mozy.com/home/pricing/">131.00</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/Mozy">Wiki</a></td> </tr> <tr> <td><a href="http://www.nomadesk.com">Nomadesk</a></td> <td style="text-align:right;"><a href="http://www.nomadesk.com/pricing/">93.57</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /></td> <td>-</td> </tr> <tr> <td><a href="https://www.sugarsync.com/">SugarSync</a></td> <td style="text-align:right;"><a href="https://www.sugarsync.com/plans/">194.94</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/windows-icon.png" alt="Windows icon" width="16" height="16" class="size-full wp-image-73321" /> <img src="../images/2013/07/mac-icon.png" alt="Mac - Icon" width="16" height="16" class="size-full wp-image-73331" /></td> <td><a href="http://en.wikipedia.org/wiki/SugarSync">Wiki</a></td> </tr> <tr> <td><a href="https://one.ubuntu.com/">Ubuntu One</a></td> <td style="text-align:right;"><a href="https://one.ubuntu.com/services/">187.09</a></td> <td>&nbsp;</td> <td><img src="../images/2013/07/accept.png" alt="accept icon" width="16" height="16" class="size-full wp-image-73351" /></td> <td><img src="../images/2013/07/tux.png" alt="Tux - Icon" width="16" height="16" class="size-full wp-image-73301" /> <img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /> <img src="../images/2013/07/cancel.png" alt="cancel" width="16" height="16" class="alignnone size-full wp-image-73371" /></td> <td><a href="http://en.wikipedia.org/wiki/Ubuntu_One">Wiki</a></td> </tr> </table> <p>I was a little bit surprised that there seems no way to use Google Drive as backup option (at least on Linux as there is <a href="http://www.change.org/en-GB/petitions/google-create-a-native-linux-google-drive-application">this petition</a> which was signed by 16,774 people).</p> <p>What could go wrong? <ul> <li>A <abbr title="Denial of service"><a href="http://en.wikipedia.org/wiki/Denial-of-service_attack">DOS</a></abbr> attack against one of those companies might lead to temporarily unavailable services.</li> <li>Financial problems, bad backup techniques or personal mistakes might lead to permanent loss of data.</li> <li>Information might get leaked to the public.</li> <li>Information might get leaked to government (<a href="http://en.wikipedia.org/wiki/PRISM_(surveillance_program)">PRISM</a>, <a href="http://en.wikipedia.org/wiki/Tempora">Tempora</a>)</li> <li>You might get analyzed by the company that stores your data. They could create a personal profile and sell that (maybe not even on the content you use, but perhaps only with filenames and edit times)</li> <li>The software you&#39;ve installed for your backup might be a malware.</li> <li>The software you&#39;ve installed might have security issues that allow attackers to execute malware.</li> </ul></p> <h2>Offline</h2> <h3>RAID</h3> <p>All <a href="http://en.wikipedia.org/wiki/RAID">RAID</a> levels (except for RAID 0) offer redundancy. This means, they store data on more than one hard disk. This way, you can restore data after on (or if maybe more) hard disk crashes. But this is by no mean a guarantee that your data is secure. </p> <p>It&#39;s recommended to use RAID with a RAID controller (a dedicated piece of hardware). Otherwise, you need some software that does it and your CPU time gets wasted with these operations.</p> <p>What could go wrong: <ul> <li>One disk fails. You buy a new one to get security back, the RAID controller copies information to the new disk that replaced the crashed one. While it copies, the other disk gets heavy load. This heavy load might lead to another crash. Boom. Your data is lost.</li> <li>Your computer might get damaged (e.g. by a fire, by an earthquake, by overvoltage, by a cup of tea you accidentally threw over it, by an <a href="http://www.youtube.com/watch?v=HtTUsOKjWyQ">act of agression</a>)</li> <li>A burglar would probably steal all hardware you have at home.</li> </ul></p> <p>But RAID is no option for me as I use a notebook as my main computer.</p> <h3>External HDD</h3> <p>A very easy way to secure your files is an external hard disk drive. You can choose by yourself what and when to save your files for redundancy. But as I know myself, I will make those backups less often after a while. So I guess this will not work for me.</p> <p>You could probably also make an external HDD raid.</p> <h2>More possibilities</h2> <ul> <li><a href="http://aws.amazon.com/de/s3/#pricing">Amazon S3 Glacier</a> for 15.44 Euro/year or Amazon S3 Standard for 133.34 Euro/year e.g. with <a href="http://www.dragondisk.com/">DragonDisk</a> and <a href="http://ijaar.com/amazon-s3-tools/">others</a> - transactions are not included!</li> <li>Give external hard disks to friends / to bank.</li> <li>Software: <ul> <li><a href="http://en.wikipedia.org/wiki/Rsync">rsync</a> for Linux</li> <li><a href="http://en.wikipedia.org/wiki/Time_Machine_(Mac_OS)">Time machine</a> for Mac</li> </ul> </li> </ul> <h2>See also</h2> <ul> <li><a href="http://www.marco.org/2010/11/20/instapapers-backup-method">Instapaper&rsquo;s backup method</a></li> </ul> Improve German Public Transportation http://martin-thoma.com/improve-german-public-transportation Sat, 06 Jul 2013 18:45:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/improve-german-public-transportation <p>Public transportation in Germany is much worse than it could be. I&#39;ve got quite angry today because of that and thought about ways to improve the situation.</p> <p><strong>A story from today:</strong> I&#39;ve bought two tickets to get from Karlsruhe to Augsburg (230 km) in about a month. I wanted to visit my dad in summer break just after an exam. I&#39;ve bought a fixed connection to get there for &quot;only&quot; 35 Euro instead of 59 Euro. But I&#39;ve made a mistake, my conenction started to early. Two hours after having bought the tickets, I wanted to exchange them for a connection that starts later. But I had to pay 15 Euro for exchanging them, 15 Euro for canceling the connection. And it got worse: I had to give them my home address to get at least some of the money back. For what the hell do they need my home address?</p> <h2>What could get improved?</h2> <ul> <li>Most people basically choose one company: <a href="http://en.wikipedia.org/wiki/Deutsche_Bahn">Deutsche Bahn</a></li> <li>It's too expensive.</li> <li>Customer service of "Deutsche Bahn" is very bad.</li> <li>Delays of at least 10 minutes always happen VERY often, delays of more than 30 minutes happen from time to time; I already had delay of more than 2 hours.</li> </ul> <h2>Alternative companies</h2> <p>Most people choose &quot;Deutsche Bahn&quot; (short: DB) because it is the biggest company that provides public transportation when you want to travel between cities. DB is well known and connects all big cities. However, there are alternatives.</p> <p>After a law (&sect; 13 Abs. 2 of the <a href="http://de.wikipedia.org/wiki/Personenbef%C3%B6rderungsgesetz_(Deutschland)">Personenbef&ouml;rderungsgesetz</a>) was annulled, bus companies provided alternatives to traveling by train. Some companies are:</p> <ul> <li><a href="http://meinfernbus.de/">MeinFernbus.de</a></li> <li><a href="http://www.univers-reisen.de/">univers-reisen.de</a></li> <li><a href="http://www.city2city.de/">City2City.de</a></li> </ul> <p>But they are difficult to find and people maybe don&#39;t trust in them.</p> <h2>Informing people</h2> <p><a href="https://www.google.com/intl/de/landing/transit/#dmy">Google Transit</a>, <a href="https://www.fahrtenfuchs.de/">FahrtenFuchs.de</a> and <a href="http://www.busliniensuche.de/">Busliniensuche.de</a> provide one possibility to inform people. But they all seem to have only a few bus companies.</p> <p>Google Transit is interesting as they provide <a href="https://developers.google.com/transit/gtfs/reference?hl=en">format specification</a> for exchanging transit information.</p> <h2>What could be done</h2> <ul> <li>Contact bus companies and ask them if they want to provide transit information to the public in Google Transit Feed Format. You might want to hint them to <a href="http://maps.google.com/help/maps/mapcontent/transit/index.html">Google Transit Partner Program</a>. <ul> <li>I've contacted "meinfernbus.de" (Saturday, 06.07.2013). Lets see if they answer.</li> <li>Contacted "KVV.de" (Saturday, 06.07.2013)</li> <li>Contacted "avv-augsburg.de" (Saturday, 06.07.2013)</li> </ul> </li> <li>Write software that allows bus companies to get their data into Google Transit Format <ol> <li>Write standard relational SQL database to store the required information</li> <li>Create <abbr title="user interface">UI</abbr> scribbles (e.g. with <a href="../how-can-i-sketch-an-application/" title="How can I sketch an application?">Balsamiq</a>)</li> <li>Write software</li> </ol> </li> </ul> <h2>Some reactions</h2> <h3>AVV (Augsburg)</h3> <p>My email from 06.07.2013 to kundencenter@avv-augsburg.de: <blockquote>Sehr geehrte Damen und Herren,</p> <p>ich habe gerade gesehen, dass Google die M&ouml;glichkeit anbietet, die Fahrplaninformationen in Google Maps einzubinden: http://maps.google.com/help/maps/mapcontent/transit/index.html</p> <p>K&ouml;nnten Sie das anbieten? Es ist vermutlich deutlich einfacher, die Fahrplanauskunft von Google zu nutzen als auf die AVV-Seite zu gehen.</p> <p>Mit freundlichen Gr&uuml;&szlig;en, Martin Thoma</blockquote></p> <p>No reaction by now (21.07.2013)</p> <h3>KVV (Karlsruhe)</h3> <p>They have called me on 07.07.2013 and told me that they plan to bring the information to Google Maps, although they don&#39;t know how long it will take.</p> <h3>MeinFernbus.de</h3> <p>My email from 06.07.2013:</p> <blockquote>Sehr geehrte Damen und Herren, ich habe mich heute sehr &uuml;ber die Deutsche Bahn ge&auml;rgert und auf der Suche nach Alternativen meinfernbus.de gefunden. Allerdings habe ich zuerst &uuml;ber Google Maps nach Busverbindungen zwischen Karlsruhe und Augsburg gesucht, wo mir leider nur die Bahn angeboten wurde. Haben Sie schon von Google Transit<http://maps.google.com/help/maps/mapcontent/transit/index.html>geh&ouml;rt? Was halten Sie davon, an diesem Programm teilzunehmen? Mit freundlichen Gr&uuml;&szlig;en, Martin Thoma</blockquote> <p>Answer from 08.07.2013: <blockquote>Sehr geehrter Herr Thoma,</p> <p>bitte entschuldigen Sie die sp&auml;te Antwort.</p> <p>Vielen Dank f&uuml;r Ihre Email, Ihre Kooperationsanfrage ist bei uns eingegangen. Wir freuen uns sehr, dass Sie mit MeinFernbus.de, dem Marktf&uuml;hrer im deutschen Fernbusverkehr, zusammenarbeiten m&ouml;chten.</p> <p>Wir pr&uuml;fen gerne eine entsprechende Zusammenarbeit. Zu gegebener Zeit setzt sich unser Kooperationsmanager mit Ihnen in Verbindung. Aufgrund der Vielzahl eingehender Anfragen bitten wir Sie zun&auml;chst noch um etwas Geduld.</p> <p>Vielen Dank f&uuml;r Ihr Verst&auml;ndnis, herzliche Gr&uuml;&szlig;e aus der Hauptstadt</p> <p>Friederike Freytag</blockquote></p> <h2>See also</h2> <ul> <li><a href="http://www.youtube.com/watch?v=j6dCCq0XL6w">Reisetagebuch</a> (A German comedian)</li> </ul> Graphic filters http://martin-thoma.com/graphic-filters Thu, 04 Jul 2013 16:21:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/graphic-filters <p>I begin to fall in love with JavaScript and HTML5. You can access your Webcam with JS! As an example, I&#39;ve implemented some graphic filters.</p> <h2>Basics</h2> <h3>HTML5</h3> <p>You need: <ul> <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas"><canvas></a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video"><video></a></li> </ul></p> <p>This is the bare minimum HTML code you need for valid HTML:</p> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="cp">&lt;!DOCTYPE html&gt;</span> <span class="nt">&lt;html&gt;</span> <span class="nt">&lt;head&gt;</span> <span class="nt">&lt;title&gt;</span>Some title<span class="nt">&lt;/title&gt;</span> <span class="nt">&lt;/head&gt;</span> <span class="nt">&lt;body&gt;</span> <span class="nt">&lt;video</span> <span class="na">autoplay</span> <span class="na">id=</span><span class="s">&quot;vid&quot;</span> <span class="na">style=</span><span class="s">&quot;display:none;&quot;</span><span class="nt">&gt;&lt;/video&gt;</span> <span class="nt">&lt;canvas</span> <span class="na">id=</span><span class="s">&quot;canvas&quot;</span> <span class="na">width=</span><span class="s">&quot;640&quot;</span> <span class="na">height=</span><span class="s">&quot;480&quot;</span><span class="nt">&gt;&lt;/canvas&gt;</span> <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;graphic-filter.js&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;/script&gt;</span> <span class="nt">&lt;/body&gt;</span> <span class="nt">&lt;/html&gt;</span> </code></pre></div> <h3>JavaScript</h3> <p>Important functions / datastructures are: <ul> <li><a href="https://developer.mozilla.org/en-US/docs/WebRTC/navigator.getUserMedia">getUserMedia</a>: see <a href="http://caniuse.com/stream">support by browsers</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/ImageData">ImageData</a>: WTF? The image is a ONE dimensional array of integers in 0, ..., 255. So the first 4 array elements describe the pixel (0|0) with its RGBA value</li> </ul></p> <p>A starting point for your code might be:</p> <div class="highlight"><pre><code class="javascript language-javascript" data-lang="javascript"><span class="s1">&#39;use strict&#39;</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">video</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#vid&quot;</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#canvas&#39;</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">getContext</span><span class="p">(</span><span class="s1">&#39;2d&#39;</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">localMediaStream</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">onCameraFail</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Camera did not work.&#39;</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span> <span class="p">};</span> <span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span> <span class="nx">snapshot</span><span class="p">()</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">localMediaStream</span><span class="p">)</span> <span class="p">{</span> <span class="nx">context</span><span class="p">.</span><span class="nx">drawImage</span><span class="p">(</span><span class="nx">video</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="mi">640</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">height</span> <span class="o">=</span> <span class="mi">480</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">imgDataNormal</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">getImageData</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">imgData</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">createImageData</span><span class="p">(</span><span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">);</span> <span class="c1">// convert image to grayscale</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">imgData</span><span class="p">.</span><span class="nx">width</span><span class="o">*</span><span class="nx">imgData</span><span class="p">.</span><span class="nx">height</span><span class="o">*</span><span class="mi">4</span><span class="p">;</span> <span class="nx">i</span> <span class="o">+=</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">r</span> <span class="o">=</span> <span class="nx">imgDataNormal</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">0</span><span class="p">];</span> <span class="kd">var</span> <span class="nx">g</span> <span class="o">=</span> <span class="nx">imgDataNormal</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span> <span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">imgDataNormal</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span> <span class="kd">var</span> <span class="nx">brightness</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="nx">r</span><span class="o">+</span><span class="mi">4</span><span class="o">*</span><span class="nx">g</span><span class="o">+</span><span class="nx">b</span><span class="p">)</span><span class="o">&gt;&gt;&gt;</span><span class="mi">3</span><span class="p">;</span> <span class="nx">imgData</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">brightness</span><span class="p">;</span> <span class="nx">imgData</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nx">brightness</span><span class="p">;</span> <span class="nx">imgData</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">i</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="nx">brightness</span><span class="p">;</span> <span class="p">}</span> <span class="nx">context</span><span class="p">.</span><span class="nx">putImageData</span><span class="p">(</span><span class="nx">imgData</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="p">}</span> <span class="p">},</span> <span class="mi">500</span><span class="p">);</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">getUserMedia</span> <span class="o">=</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">getUserMedia</span> <span class="o">||</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">webkitGetUserMedia</span> <span class="o">||</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">mozGetUserMedia</span> <span class="o">||</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">msGetUserMedia</span><span class="p">;</span> <span class="nb">window</span><span class="p">.</span><span class="nx">URL</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">URL</span> <span class="o">||</span> <span class="nb">window</span><span class="p">.</span><span class="nx">webkitURL</span><span class="p">;</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">getUserMedia</span><span class="p">({</span><span class="nx">video</span><span class="o">:</span><span class="kc">true</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">stream</span><span class="p">)</span> <span class="p">{</span> <span class="nx">video</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">URL</span><span class="p">.</span><span class="nx">createObjectURL</span><span class="p">(</span><span class="nx">stream</span><span class="p">);</span> <span class="nx">localMediaStream</span> <span class="o">=</span> <span class="nx">stream</span><span class="p">;</span> <span class="p">},</span> <span class="nx">onCameraFail</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">localMediaStream</span><span class="p">);</span> </code></pre></div> <h2>Interactive example</h2> <div class="info"> You need a webcam for this: <a href="../html5/graphic-filters/graphic-filters.htm" target="_blank">Open demonstration in new window</a> </div> <p>This is what it should look like: <div style="width: 664px" class="wp-caption aligncenter"><a href="../images/2013/07/graphic-webcam-html5-js-example.png"><img src="../images/2013/07/graphic-webcam-html5-js-example.png" alt="" width="664" height="395" class="size-full wp-image-72801"/></a><p class="wp-caption-text"></p></div></p> <p>And it gives these results: [gallery ids=&quot;72871,72861,72831&quot;]</p> <p>By the way, you can check if a website is currently accessing your webcam (with Google Chrome):</p> <div style="width: 370px" class="wp-caption aligncenter"><a href="../images/2013/07/webcam-red-dot.png"><img src="../images/2013/07/webcam-red-dot.png" alt="" width="370" height="125" class="size-full wp-image-72811"/></a><p class="wp-caption-text"></p></div> <p>If you want to use these examples from your Android phone, you might have to enable getUserMedia. To do this, enable &quot;Web RTC&quot; in &quot;chrome://flags&quot;: <div style="width: 180px" class="wp-caption aligncenter"><a href="../images/2013/07/enable-webrtc-180x300.png"><img src="../images/2013/07/enable-webrtc-180x300.png" alt="" width="180" height="300" class="size-medium wp-image-73191"/></a><p class="wp-caption-text"></p></div></p> three.js is AWESOME! http://martin-thoma.com/three-js-is-awesome Mon, 01 Jul 2013 14:21:44 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/three-js-is-awesome <p>I recently discovered <a href="http://en.wikipedia.org/wiki/Three.js">three.js</a>, a JavaScript library/API used to create and display animated 3D computer graphics. </p> <p>Here are some examples what you can do with three.js. It&#39;s pure JavaScript, no Flash required!</p> <p>They all worked smooth on my Notebook (<a href="http://ark.intel.com/products/50176/Intel-Pentium-Processor-P6200-3M-Cache-2_13-GHz">Intel Pentium P6200</a> processor) with Google Chrome 28 on Linux.</p> <div class="info">You have to click on the links to see the examples!</div> <h2>Stemkoski</h2> <h3>Textures</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-textures.png"><img src="../images/2013/07/threejs-textures.png" alt="" width="512" height="228" class="size-full wp-image-72431"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Textures.html">Demonstration</a></p> <h3>Three.js</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-skybox.png"><img src="../images/2013/07/threejs-skybox.png" alt="" width="512" height="286" class="size-full wp-image-72441"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Skybox.html">Demonstration</a></p> <h3>Reflection</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-reflection.png"><img src="../images/2013/07/threejs-reflection.png" alt="" width="512" height="278" class="size-full wp-image-72451"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Reflection.html">Demonstration</a></p> <h3>Webcam</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-webcam.png"><img src="../images/2013/07/threejs-webcam.png" alt="" width="512" height="263" class="size-full wp-image-72461"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Many-Cameras.html">Demonstration</a></p> <h3>Motion detection</h3> <div style="width: 556px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-motion.png"><img src="../images/2013/07/threejs-motion.png" alt="" width="556" height="326" class="size-full wp-image-72471"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Webcam-Motion-Detection.html">Demonstration</a></p> <h3>3D function plotter</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/threejs-3d-function.png"><img src="../images/2013/07/threejs-3d-function.png" alt="" width="512" height="312" class="size-full wp-image-72481"/></a><p class="wp-caption-text"></p></div> <p><a href="http://stemkoski.github.io/Three.js/Graphulus-Function.html">Demonstration</a></p> <h2>HexGL</h2> <iframe width="512" height="288" src="//www.youtube.com/embed/se-oorr2zM8" frameborder="0" allowfullscreen></iframe> <p><a href="http://hexgl.bkcore.com/">Demonstration</a></p> <h2>Solar System</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/solar-system-simulation.png"><img src="../images/2013/07/solar-system-simulation.png" alt="" width="512" height="323" class="size-full wp-image-72501"/></a><p class="wp-caption-text"></p></div> <p><a href="http://www.webdev20.pl/skins/default/js/demos/solar_system/index.html">Demonstration</a></p> <h2>Planet Maker</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/07/PlanetMaker.png"><img src="../images/2013/07/PlanetMaker.png" alt="" width="512" height="313" class="size-full wp-image-72521"/></a><p class="wp-caption-text"></p></div> <p><a href="http://planetmaker.wthr.us/?model=51b8d1021fef93.32065956">Demonstration</a> - takes ages to load, but when its loaded it is fast</p> <h2>See also</h2> <ul> <li><a href="http://stemkoski.github.io/Three.js/">stemkoski</a>: Many examples</li> <li><a href="http://www.chromeexperiments.com/tag/3d/">Chrome Experiments</a></li> </ul> Music videos http://martin-thoma.com/music-videos Sun, 30 Jun 2013 19:21:51 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/music-videos <h2>Paint: Lord of the Rings</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/3FPxYDGfniM" frameborder="0" allowfullscreen></iframe> <h2>Chatroulette Concert</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/LfamTmY5REw" frameborder="0" allowfullscreen></iframe> <h2>Chatroulette Love Song</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/fU1x8Ll62QE" frameborder="0" allowfullscreen></iframe> <h2>28 Cartoon Theme Songs in 7 Minutes</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/lRUHVFQxbE4" frameborder="0" allowfullscreen></iframe> <h2>Bodo Wartke - Da muss er durch</h2> <iframe width="512" height="288" src="//www.youtube.com/embed/vw_ECJKdNcE" frameborder="0" allowfullscreen></iframe> <ul> <li><a href="http://www.youtube.com/watch?v=ZOb0bErcDyg">Liebeslied</a> (In German, English, French, Spanish, Italian, Chinese, Russian, Turkish, Arabic, Bavarian, Swiss, Finnish)</li> <li><a href="http://www.youtube.com/watch?v=QpF0MRGwOQA">Believe in Steve</a></li> </ul> <h2>Atomic Theory Song</h2> <iframe width="512" height="384" src="//www.youtube.com/embed/07yDiELe83Y" frameborder="0" allowfullscreen></iframe> <h2>The 50 States Of The USA and The Capitals</h2> <iframe width="512" height="384" src="//www.youtube.com/embed/0ZhZhWnbkO8" frameborder="0" allowfullscreen></iframe> <p>(From television series &quot;Animaniacs&quot;)</p> <ul> <li><a href="http://www.youtube.com/watch?v=VyzQItUhXyw">Nations of the world</a></li> <li><a href="http://www.youtube.com/watch?v=f_J5rBxeTIk">Yakko's Universe Song</a></li> <li><a href="http://www.youtube.com/watch?v=s8eFFnJsCjs">The Planet Song</a></li> <li><a href="http://www.youtube.com/watch?v=EGMBUzFyVl4">Panama Canal</a></li> </ul> Spline interpolation http://martin-thoma.com/spline-interpolation Sun, 30 Jun 2013 11:58:20 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/spline-interpolation <p>Just like before with polynomial interpolation, we have a list of <code>$n+1$</code> given point <code>$(x_i, y_i)$</code> with <code>$x_0 &lt; x_1 &lt; \dots &lt; x_n$</code>. </p> <p>We want to find a function that goes through those points and approximates the underlying function that produced that points as good as possible.</p> <h2>Polynomial interpolation</h2> <p>The problem of polynomial interpolation were oscillations at the end of the interval you wanted to interpolate (see <a href="../html5/polynom-interpolation.htm?function=1%2F(25*x*x%2B1)&evaluationSteps=0.01&X_MIN=-1.5&X_MAX=1.5&Y_MAX=1.2&Y_MIN=-1.2&X_TICKS_STEPS=0.2&Y_TICKS_STEPS=0.2&X_FROM=-1&X_TO=1&N_EVALUATION_POINTS=10&points=%5B%5D&tschebyscheffSwitch=true&equallySwitch=true">interactive example</a>):</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/06/polynomial-interpolation-oscillation-300x105.png"><img src="../images/2013/06/polynomial-interpolation-oscillation-300x105.png" alt="" width="300" height="105" class="size-medium wp-image-72001"/></a><p class="wp-caption-text"></p></div> <p>As you can see, polynomial interpolation with equally spaced points is very, very bad at the ends of the interval. Tschebyscheff spaced points are much better, but you can still see that the interpolated function is different from the original.</p> <h2>Splines</h2> <p>A way to solve this problem are splines. A spline is a piecewise-defined function that goes through some points (aka knots) and is smooth. </p> <p>More formally: Let <code>$s: [x_0,x_n] \rightarrow \mathbb{R}$</code> be a spline. Then: <ol style="list-style-type: none;"> <li>(S1) <strong>cubic</strong>: <code>$\forall i \in \{1, \dots, n\}: s|_{x_{i-1}, x_i}$</code> is a cubic function</li> <li>(S2) <strong>interpolation</strong>: <code>$\forall i \in \{0, \dots, n\}: s(x_i) = y_i$</code></li> <li>(S3) <strong>smooth</strong>: <code>$s \in C^2([x_0, x_n])$</code> and <code>$\int_{x_0}^{x_n} s&#39;&#39;(x)^2 \mathrm{d}x$</code> is minimal</li> </ol></p> <p>When you use a cubic function <code>$a x^3 + b x^2 + cx + d$</code> for each of the <code>$n$</code> intervals that we got by our <code>$n+1$</code> points, you have <code>$4n$</code> variables that you need to calculate.</p> <p>Condition (S2) gives two equations per interval which makes <code>$2n$</code> equations of the form:</p> <p><code>$ \begin{align} y_i &amp;= a_i x_i^3 &amp;&amp;+ b_i x_i^2 &amp;&amp;+ c_i x_i &amp;&amp;+ d_i\\ y_{i+1} &amp;= a_i x_{i+1}^3 &amp;&amp;+ b_i x_{i+1}^2 &amp;&amp;+ c_i x_{i+1} &amp;&amp;+ d_i \end{align} $</code></p> <p>At first glance condition (S3) - <code>$s \in C^2([x_0, x_n])$</code> - seems to be redundant with (S1) - <code>$s$</code> is piecewise cubic. Every polynomial is in <code>$C^\infty(\mathbb{R})$</code>, so it certainly is in <code>$C^2([x_0, x_n])$</code>.<br/> That&#39;s correct. But <code>$s$</code> is not a polynomial. It&#39;s only piecewise-defined as a polynomial. That makes a difference at the ends of the intervals. And it gives us <code>$2n-2$</code> more equations:</p> <p><code>$\displaystyle \begin{align} s_i&#39; (x_{i}) &amp;= s_{i+1}&#39;(x_{i}) \;\;\; &amp;&amp;\forall i=1, \dots, n-1\\ s_i&#39;&#39;(x_{i}) &amp;= s_{i+1}&#39;&#39;(x_{i}) \;\;\; &amp;&amp;\forall i=1, \dots, n-1 \end{align} $</code></p> <p>which is equivalent to</p> <p><code>$\displaystyle \begin{align} 3a_i x_i^2 + 2b_i x_i + c_i &amp;= 3a_{i+1} x_i^2 + 2b_{i+1} x_i + c_{i+1} \;\;\; &amp;&amp;\forall i=1, \dots, n-1\\ 6a_i x_i + 2b_i &amp;= 6a_{i+1} x_i + 2b_{i+1} \;\;\; &amp;&amp;\forall i=1, \dots, n-1 \end{align} $</code></p> <p>All equations we have are linear. Please note that the variables we want to determine are <code>$a_i, b_i, c_i, d_i$</code>. So <code>$x_i^3$</code> is simply a multiplicative constant that we have to evaluate before we solve our system of equations.</p> <p>But at the moment, we only have <code>$2n+2\cdot(n-1) = 4n -2$</code> equations, but we have <code>$4n$</code> variables. So we need ancillary conditions to solve this linear system of equations.</p> <h2>Possible ancillary conditions</h2> <ul> <li><strong>natural splines</strong>: `$s''(x_0) =0, \;\;\; s''(x_n) = 0$`</li> <li><strong>clamped splines</strong>: `$s'(x_0) = f'(x_0),\;\;\; s'(x_n)= f'(x_n)$` where `$y_0'$` and `$y_n'$` can be any value</li> <li><strong>periodic</strong>: `$s'(x_0) = s'(x_n), \;\;\; s''(x_0) = s''(x_n)$`</li> <li><strong>not-a-knot</strong>: `$s_1''' = s_2''', \;\;\; s_{n-1}''' = s_{n}'''$`</li> </ul> <p>George MacKerron shows how the results can differ in his article <a href="http://blog.mackerron.com/2011/01/01/javascript-cubic-splines/">Cubic splines in JavaScript (via CoffeeScript)</a>:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/06/ancillary-conditions-splines-results.png"><img src="../images/2013/06/ancillary-conditions-splines-results.png" alt="" width="500" height="267" class="size-full wp-image-72221"/></a><p class="wp-caption-text"></p></div> <h2>Code for natural splines</h2> <p>I will store splines as a list of maps. Each map is one piece of the spline and has: <ul> <li><code>$u$</code>: Start of the interval</li> <li><code>$v$</code>: End of the interval</li> <li><code>$a,b,c,d$</code>: cubic function <code>$ax^3 + bx^2 + cx +d$</code></li> </ul></p> <p>Please note that I didn&#39;t test the code below. It&#39;s likely that there are errors with indices.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">niceCubicPolynomial</span><span class="p">(</span><span class="n">p</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;a&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot; x^3&quot;</span> <span class="k">elif</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;a&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="si">%.2f</span><span class="s">x^3&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;a&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;b&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">+ x^2&quot;</span> <span class="k">elif</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;b&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">+ </span><span class="si">%.2f</span><span class="s">x^2&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;b&quot;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t\t</span><span class="s">&quot;</span> <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;c&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">+ x&quot;</span> <span class="k">elif</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;c&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">+ </span><span class="si">%.2f</span><span class="s">x&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;c&quot;</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t\t</span><span class="s">&quot;</span> <span class="k">if</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;d&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">+ </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;d&quot;</span><span class="p">]</span> <span class="k">return</span> <span class="n">tmp</span> <span class="k">def</span> <span class="nf">getSpline</span><span class="p">(</span><span class="n">points</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; points should be a list of maps, </span> <span class="sd"> where each map represents a point and has &quot;x&quot; and &quot;y&quot; &quot;&quot;&quot;</span> <span class="kn">import</span> <span class="nn">numpy</span><span class="o">,</span> <span class="nn">scipy.linalg</span> <span class="c"># sort points by x value</span> <span class="n">points</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">point</span><span class="p">:</span> <span class="n">point</span><span class="p">[</span><span class="s">&quot;x&quot;</span><span class="p">])</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">points</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="c"># Set up a system of equations of form Ax=b</span> <span class="n">A</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="mi">4</span><span class="o">*</span><span class="n">n</span><span class="p">))</span> <span class="n">b</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="c"># 2n equations from condtions (S2)</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">3</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;y&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">3</span> <span class="n">A</span><span class="p">[</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="n">A</span><span class="p">[</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">b</span><span class="p">[</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;y&quot;</span><span class="p">]</span> <span class="c"># 2n-2 equations for (S3):</span> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># point i is an inner point</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">0</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">6</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">0</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span> <span class="n">b</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">0</span> <span class="c"># Natural spline:</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">6</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">2</span> <span class="n">b</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">0</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">6</span><span class="o">*</span><span class="n">points</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">2</span> <span class="n">b</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">0</span> <span class="n">x</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="n">spline</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">spline</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;u&quot;</span><span class="p">:</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">],</span> <span class="s">&quot;v&quot;</span><span class="p">:</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">],</span> <span class="s">&quot;a&quot;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">0</span><span class="p">]),</span> <span class="s">&quot;b&quot;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]),</span> <span class="s">&quot;c&quot;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">]),</span> <span class="s">&quot;d&quot;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span><span class="p">])})</span> <span class="k">return</span> <span class="n">spline</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">points</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="o">-</span><span class="mi">4</span><span class="p">})</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="mi">9</span><span class="p">})</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="mf">2.0</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="mi">35</span><span class="p">})</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="mf">3.0</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="mi">70</span><span class="p">})</span> <span class="n">spline</span> <span class="o">=</span> <span class="n">getSpline</span><span class="p">(</span><span class="n">points</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">spline</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">=</span> <span class="s">&quot;[</span><span class="si">%.2f</span><span class="s">, </span><span class="si">%.2f</span><span class="s">]:&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="s">&quot;u&quot;</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="s">&quot;v&quot;</span><span class="p">])</span> <span class="n">tmp</span> <span class="o">+=</span> <span class="n">niceCubicPolynomial</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> </code></pre></div> <h2>See also</h2> <ul> <li><a href="http://math.stackexchange.com/q/430141/6876">How do the different ancillary conditions for splines differ?</a></li> </ul> Zero Mean Normalized Cross-Correlation http://martin-thoma.com/zero-mean-normalized-cross-correlation Fri, 28 Jun 2013 20:15:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/zero-mean-normalized-cross-correlation <div style="width: 128px" class="wp-caption alignright"><a href="../images/2013/06/image-correlation.png"><img src="../images/2013/06/image-correlation.png" alt="" width="128" height="128" class="size-full wp-image-71931"/></a><p class="wp-caption-text"></p></div> <p>Zero Mean Normalized Cross-Correlation or shorter ZNCC is an integer you can get when you compare two grayscale images.</p> <p>Lets say you have a webcam at a fixed position for security. It takes images all the time, but most of the time the room is empty. So quite a lot of images will not be interesting. They only waste space. So you want to get rid of those redundant images.</p> <p>BUT those images are not identical! Even if the scenery didn&#39;t change, your sensor will produce slightly different results. A human will not notice them, but you can&#39;t simply compare images bit by bit. Even if you could, the images will be different because the sun moved (and so do shadows) and perhaps you have a clock in the image.</p> <p>Now you can solve this problem with various techniques.</p> <p>I want to describe those techniques in a very general way. As the images in other scenarios might have different sizes and you probably don&#39;t want to compare whole images, I&#39;ll assume you have a part of both image of size <code>$(2n+1) \times (2n+1)$</code>. The pixel in the center has coordinates <code>$(u_1, v_1)$</code> for the part of the first image and <code>$(u_2, v_2)$</code> for the second image.</p> <h2>Sum of squared differences</h2> <p>Go through all pixels, get the difference of both and add up the squares:</p> <p><code>$\displaystyle SSD(Img_1, Img_2, u_1, v_1, u_2, v_2, n) := \sum_{i=-n}^n \sum_{j=-n}^n \left ( Img_1(u_1+i, v_1+j) - Img_2(u_2 + i, v_2 + j) \right )^2$</code></p> <p>When SSD is small, both images are very similar. Wehn SSD is 0, the images are identical.</p> <h2>Zero Mean Normalized Cross-Correlation</h2> <p>The average gray value is: <code>$\displaystyle \overline{Img}(u, v, n) := \frac{1}{(2n+1)^2} \sum_{i=-n}^n \sum_{j=-n}^n Img(u+i, v+j)$</code></p> <p>The standard deviation is: <code>$\displaystyle \sigma(u, v, n) := \sqrt{\frac{1}{(2n+1)^2} \left (\sum_{i=-n} \sum_{j=-n}^n (Img(u +i, v+j)-\overline{Img}(u, v, n))^2 \right )}$</code></p> <p>The ZNCC is defined as:</p> <p><code>$\displaystyle ZNCC(Img_1, Img_2, u_1, v_1, u_2, v_2, n) := \frac{\frac{1}{(2n+1)^2}\sum_{i=-n}^n \sum_{j=-n}^n \prod_{t=1}^2 \left (Img_t (u_t+i,v_t+j) - \overline{Img}(u_t, v_t, n) \right )}{\sigma_1(u_1, v_1, n) \cdot \sigma_2(u_2, v_2, n)}$</code></p> <p>The higher the ZNCC gets, the more are those two images correlated. (I think the value is always in [0, 1])</p> <p>Here is some Python code:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">getAverage</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;img as a square matrix of numbers&quot;&quot;&quot;</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">s</span> <span class="o">+=</span> <span class="n">img</span><span class="p">[</span><span class="n">u</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">v</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> <span class="k">def</span> <span class="nf">getStandardDeviation</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">avg</span> <span class="o">=</span> <span class="n">getAverage</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">s</span> <span class="o">+=</span> <span class="p">(</span><span class="n">img</span><span class="p">[</span><span class="n">u</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">v</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">avg</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> <span class="k">return</span> <span class="p">(</span><span class="n">s</span><span class="o">**</span><span class="mf">0.5</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">def</span> <span class="nf">zncc</span><span class="p">(</span><span class="n">img1</span><span class="p">,</span> <span class="n">img2</span><span class="p">,</span> <span class="n">u1</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">u2</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">stdDeviation1</span> <span class="o">=</span> <span class="n">getStandardDeviation</span><span class="p">(</span><span class="n">img1</span><span class="p">,</span> <span class="n">u1</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">stdDeviation2</span> <span class="o">=</span> <span class="n">getStandardDeviation</span><span class="p">(</span><span class="n">img2</span><span class="p">,</span> <span class="n">u2</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">avg1</span> <span class="o">=</span> <span class="n">getAverage</span><span class="p">(</span><span class="n">img1</span><span class="p">,</span> <span class="n">u1</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">avg2</span> <span class="o">=</span> <span class="n">getAverage</span><span class="p">(</span><span class="n">img2</span><span class="p">,</span> <span class="n">u2</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">s</span> <span class="o">+=</span> <span class="p">(</span><span class="n">img1</span><span class="p">[</span><span class="n">u1</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">v1</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">avg1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">img2</span><span class="p">[</span><span class="n">u2</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">v2</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">avg2</span><span class="p">)</span> <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="o">/</span><span class="p">((</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="n">stdDeviation1</span> <span class="o">*</span> <span class="n">stdDeviation2</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],[</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">],[</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">]]</span> <span class="n">B1</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],[</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">],[</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">]]</span> <span class="n">B2</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],[</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">],[</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">7</span><span class="p">]]</span> <span class="k">print</span><span class="p">(</span><span class="n">zncc</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">zncc</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> </code></pre></div> <h2>See also</h2> <ul> <li><a href="http://www.site.uottawa.ca/research/viva/projects/imagepairs/">Feature point image matching</a></li> <li><a href="http://www.cvlab.cs.tsukuba.ac.jp/index.php?CVLAB%20Home%20Page">Tsukuba University stereo images</a>: Just in case you want to try those algorithms</li> <li><a href="http://siddhantahuja.wordpress.com/tag/normalized-cross-correlation/">Correlation based similarity measures-Summary</a></li> <li><a href="http://www.ti.uni-bielefeld.de/downloads/publications/diploma_theses/ba11_bboettcher_illuminationchange.pdf">Bachelorarbeit</a>: Bildvorverarbeitung und Bild&auml;hnlichkeitsfunktionen f&uuml;r beleuchtungstolerante visuelle Navigation (German)</li> </ul> JavaScript: WTF?!? http://martin-thoma.com/javascript-wtf Wed, 26 Jun 2013 20:51:52 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/javascript-wtf <p>JavaScript is THE web programming language. It gets interpreted by your browser and web applications like Google Mail, Google Maps and Facebook make heavy use of them. Almost always, when you see something working smoothly / interactive, you see JavaScript in action.</p> <p>But JavaScript has a lot of &quot;features&quot; which are ... well, I don&#39;t have words for those. Just continue reading.</p> <p>Most of the following content is from a StackOverflow question <a href="http://stackoverflow.com/q/1995113/562769">Strangest language feature</a></p> <h2>Weak typing</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">3</span><span class="p">..</span><span class="nx">toString</span><span class="p">());</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash"><span class="s1">&#39;3&#39;</span> </code></pre></div> <p><strong>Explanation</strong> <strong>3.</strong> is a floating point and can get converted to a string. But <code>3.toString()</code> gives </p> <div class="highlight"><pre><code class="bash">SyntaxError: Unexpected token ILLEGAL </code></pre></div> <h2>Weak typing and string concatenation</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;5&#39;</span> <span class="o">+</span> <span class="mi">3</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;5&#39;</span> <span class="o">-</span> <span class="mi">3</span><span class="p">);</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash"><span class="s1">&#39;53&#39;</span> 2 </code></pre></div> <p><strong>Explanation</strong> JavaScript automatically converts datatypes and <code>+</code> is used for string concatenation and for addition. </p> <p>In the first case, as the first datatype is a string and <code>+</code> is defined for strings as concatenation, JS converts <code>3</code> to <code>&#39;3&#39;</code> which results in the string <code>&#39;53&#39;</code>.</p> <p>In the second case, <code>-</code> is only defined for subtraction so <code>&#39;5&#39;</code> gets converted to a number (int? float? I don&#39;t know. I guess int.)</p> <h2>Automatic semicolons</h2> <p><strong>Example 1</strong></p> <div class="highlight"><pre><code class="javascript"><span class="kd">function</span> <span class="nx">test</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span> <span class="nx">id</span> <span class="o">:</span> <span class="mi">1338</span><span class="p">,</span> <span class="nx">title</span> <span class="o">:</span> <span class="s1">&#39;This is a test&#39;</span> <span class="p">};</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">test</span><span class="p">());</span> </code></pre></div> <p><strong>Example 2</strong></p> <div class="highlight"><pre><code class="javascript"><span class="kd">function</span> <span class="nx">test</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">test</span><span class="p">());</span> </code></pre></div> <p><strong>Output 1</strong></p> <div class="highlight"><pre><code class="bash">Uncaught SyntaxError: Unexpected token : </code></pre></div> <p><strong>Output 2</strong></p> <div class="highlight"><pre><code class="bash">undefined </code></pre></div> <p><strong>Explanation</strong> JS adds a <code>;</code> at every line end. Automatically. You can&#39;t prevent it.</p> <p>Please note that the second output is no error! It has a (valid) return value of <code>undefined</code>.</p> <h2>Truth table</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- 0 == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- false == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- &#39;&#39; == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- null == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- undefined == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- \t\r\n == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- &#39;0&#39; == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- &#39;false&#39; == XYZ ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;--------------------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == 0 ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == false ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == &#39;&#39; ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;&#39;</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == null ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == undefined ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == \t\r\n ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot; \t\r\n&quot;</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="s2">&quot; \t\r\n&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == &#39;0&#39; ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;0&#39;</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="s1">&#39;0&#39;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;------- XYZ == &#39;false&#39; ---------&quot;</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;false&#39;</span> <span class="o">==</span> <span class="s1">&#39;false&#39;</span><span class="p">);</span> </code></pre></div> <p><strong>Output</strong></p> <table> <tr> <th>==</th> <th>0</th> <th>false</th> <th>''</th> <th>null</th> <th>undefined</th> <th>" \t\r\n"</th> <th>'0'</th> <th>'false'</th> </tr> <tr> <th>0</th> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> </tr> <tr> <th>false</th> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> </tr> <tr> <th>''</th> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> </tr> <tr> <th>null</th> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> </tr> <tr> <th>undefined</th> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> </tr> <tr> <th>" \t\r\n"</th> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> </tr> <tr> <th>'0'</th> <td style="background-color: lime;">true</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> <td style="background-color: red;">false</td> </tr> <tr> <th>'false'</th> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: red;">false</td> <td style="background-color: lime;">true</td> </tr> </table> <p><strong>Explanation</strong> Wow. This is fucked up. I&#39;ve expected that strings compared to anything that is not the string itself evaluates to false.</p> <p>At least the table is symmetric and the diagonal is true. Please also note that JavaScript has a <code>===</code> operator.</p> <h2>The truth</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">2</span> <span class="o">==</span> <span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">2</span> <span class="o">==</span> <span class="p">[[</span><span class="mi">2</span><span class="p">]]);</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash"><span class="nb">true</span> <span class="nb">true</span> </code></pre></div> <p><strong>Explanation</strong> At <a href="http://stackoverflow.com/a/1724551/562769">StackOverflow</a></p> <h2>Date</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="kd">var</span> <span class="nx">futureDate</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="mi">2010</span><span class="p">,</span><span class="mi">77</span><span class="p">,</span><span class="mi">154</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">futureDate</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">futureDate</span><span class="p">.</span><span class="nx">getYear</span><span class="p">());</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash">Tue Nov 01 2016 00:00:00 GMT+0100 <span class="o">(</span>CET<span class="o">)</span> 116 </code></pre></div> <p><strong>Explanation</strong> 77 months and 154 days from the 0th day of 0th month of 2010</p> <p>You should use <code>getFullYear()</code> instead of <code>getYear()</code>, as the later one returns <code>year - 1900</code> (Why? When is this useful?)</p> <h2>Integer overflow</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">111111111111111111111</span><span class="p">);</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash">111111111111111110000 </code></pre></div> <p><strong>Explanation</strong> It&#39;s ok that JavaScript fails at handling this integer. I think it converts this to a float, but I&#39;m not sure about that. But no matter what it does here, it doesn&#39;t throw an error. That&#39;s bad. How is a developer supposed to know in a big application know when something went wrong?</p> <h2>Function parameters</h2> <blockquote>In Javascript, declaring the parameters a function accepts is only a convenience to the programmer. All variables passed through the function call are accessible by the keyword <code>arguments</code>. So the following would alert "world": <div class="highlight"><pre><code class="javascript"><span class="kd">function</span> <span class="nx">blah</span><span class="p">(){</span> <span class="nx">alert</span><span class="p">(</span><span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="p">}</span> <span class="nx">blah</span><span class="p">(</span><span class="s2">&quot;hello&quot;</span><span class="p">,</span> <span class="s2">&quot;world&quot;</span><span class="p">);</span> </code></pre></div> </blockquote> <p><a href="http://stackoverflow.com/a/2023908/562769">Source</a> on StackOverflow</p> <h2>Global variables</h2> <p><strong>Example</strong></p> <div class="highlight"><pre><code class="javascript"><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">test</span><span class="p">()</span> <span class="p">{</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span> <span class="p">}</span> <span class="nx">test</span><span class="p">();</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span> </code></pre></div> <p><strong>Output</strong></p> <div class="highlight"><pre><code class="bash">1337 </code></pre></div> <p><strong>Explanation</strong> When you forget to use <code>var</code> inside of <code>test()</code> you might accidentally use a global variable. </p> <h2>See also</h2> <p>Do you know some more JavaScript WTFs?</p> <p>You might also be interested in <a href="../php-a-strange-language/" title="PHP: A strange language">PHP: A strange language</a></p> Polynomial interpolation http://martin-thoma.com/polynomial-interpolation Sat, 22 Jun 2013 16:41:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/polynomial-interpolation <p>Suppose you have a list of <code>$n+1$</code> given point <code>$(x_i, y_i)$</code> with <code>$i \in \{0, \dots, n\}$</code> and <code>$\forall i,j \in \{0, \dots, n\}: i \neq j \Rightarrow x_i \neq x_j$</code>. </p> <p>Now you want to find a polynomial <code>$\displaystyle p(x) = \sum_{i=0}^n a_i \cdot x^i$</code> that goes through all of the given points. This means:</p> <p><code>$\forall i \in \{0, \dots, n\}: p(x_i) = y_i$</code></p> <h2>Existence and uniqueness</h2> <p><strong>Theorem</strong>: When you have a list of <code>$n+1$</code> points with mutually different <code>$x_i$</code> there is exactly one polynom of degree <code>$\leq n$</code> that fits those points.</p> <p><strong>Proof</strong>:</p> <p>You can formulate a linear system of equations:</p> <p>`$\underbrace{\begin{pmatrix} x<em>0^0 &amp; \cdots &amp; x</em>0^n \ \vdots &amp; \ddots &amp; \vdots \ x<em>n^0 &amp; \cdots &amp; x</em>n^n \end{pmatrix} }<em>{:= A \in \mathbb{R}^{(n+1) \times (n+1)}} \begin{pmatrix} a</em>0 \ \vdots \ a_n</p> <h1>\end{pmatrix}</h1> <p>\begin{pmatrix} y<em>0 \ \vdots \ y</em>n \end{pmatrix}$`</p> <p>A matrix of the form of <code>$A$</code> is called <a href="https://en.wikipedia.org/wiki/Vandermonde_matrix">Vandermonde matrix</a>. When the data points <code>$x_i$</code> are mutually different, it is known that the Vandermonde matrix is invertible (<a href="http://math.stackexchange.com/q/426932/6876">source</a>).</p> <p>This means, the solution <code>$(a_0 \dots a_n)^T$</code> of this linear equation gives the polynom <code>$p(x) = \sum_{i=0}^n a_i x^i$</code></p> <p>So the solution exists and is unique <code>$\blacksquare$</code></p> <h2>Straight forward interpolating polynomials</h2> <p>For this algorithm, I&#39;ll find the polynomial in its monomial from <code>$p(x) = \sum_{i=0}^n a_i x^i$</code>. I&#39;ll use the matrix <code>$A$</code> from section &quot;<a href="#Uniqueness">Uniqueness</a>&quot;.</p> <p>You might want to take a look at my article about <a href="../solving-linear-equations-with-gaussian-elimination/" title="Solving linear equations with Gaussian elimination">Gaussian elimination</a>.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">pprintGaus</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Pretty print a n&amp;times;n matrix with a result vector n&amp;times;1. &quot;&quot;&quot;</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">line</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">if</span> <span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;| &quot;</span> <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pprintPolynomial</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Pretty print a polynomial. &quot;&quot;&quot;</span> <span class="n">line</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;+&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;+ x^&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">elif</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;- x^&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;+&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="s">&quot;&amp;middot;x^&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">def</span> <span class="nf">gauss</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Solve a linear sysem of equations given by a n&amp;times;n matrix </span> <span class="sd"> with a result vector n&amp;times;1. &quot;&quot;&quot;</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="c"># Search for maximum in this column</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">i</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">maxEl</span><span class="p">:</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">k</span> <span class="c"># Swap maximum row with current row (column by column)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="c"># Make all rows below this one 0 in current column</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="n">j</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">c</span> <span class="o">*</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># Solve equation Ax=b for an upper triangular matrix A</span> <span class="n">x</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> <span class="o">-=</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">return</span> <span class="n">x</span> <span class="k">def</span> <span class="nf">setGauss</span><span class="p">(</span><span class="n">points</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Create a system of equations for gaussian elimination from </span> <span class="sd"> a set of points. &quot;&quot;&quot;</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">points</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">x</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="o">**</span><span class="n">j</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;y&quot;</span><span class="p">]</span> <span class="k">return</span> <span class="n">A</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">fractions</span> <span class="kn">import</span> <span class="n">Fraction</span> <span class="c"># Read input data</span> <span class="n">points</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="mi">1</span><span class="p">)})</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="mi">1</span><span class="p">)})</span> <span class="n">points</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;x&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="n">Fraction</span><span class="p">(</span><span class="mi">2</span><span class="p">)})</span> <span class="n">A</span> <span class="o">=</span> <span class="n">setGauss</span><span class="p">(</span><span class="n">points</span><span class="p">)</span> <span class="c"># Print input</span> <span class="n">pprintGaus</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="c"># Calculate solution</span> <span class="n">x</span> <span class="o">=</span> <span class="n">gauss</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="c"># Print result</span> <span class="n">pprintPolynomial</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> </code></pre></div> <p>It is also interesting to get the value of <code>$p(x)$</code> at any given point <code>$x \in \mathbb{R}$</code>:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">evaluatePolynomial</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">xi</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">p</span><span class="p">):</span> <span class="n">y</span> <span class="o">+=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">xi</span> <span class="n">xi</span> <span class="o">*=</span> <span class="n">x</span> <span class="k">return</span> <span class="n">y</span> </code></pre></div> <p>Time complexity to get the polynomial: <code>$\frac{1}{3} n^3 + \mathcal{O}(n^2)$</code> (where <code>$n$</code> is the number of points) Space complexity for the polynomial: <code>$\mathcal{O}(n^2)$</code> (where <code>$n$</code> is the number of points)</p> <p>Time complexity to evaluate the value of <code>$p(x)$</code> for any <code>$x \in \mathbb{R}$</code>: <code>$\mathcal{O}(n)$</code>.</p> <h2>Polynomials</h2> <p><code>$\displaystyle \mathbb{R}_n[X] := \left \{p:\mathbb{R} \rightarrow \mathbb{R} | p(x) = \sum_{i=0}^n a_i \cdot x^i \text{ with } a_0, \dots, a_n \in \mathbb{R} \right \}$</code> </p> <p>So <code>$\mathbb{R}_n[X]$</code> are all polynomials with real coefficients and degree not higher than latex]n<code>$. $</code>\mathbb{R}<em>n[X]<code>$ forms a vector space for $</code>n \in \mathbb{N}</em>0<code>$. The degree of that vector space is $</code>n+1`$.</p> <p>What does that mean?</p> <p>This means you can use different bases for polynomials. The base we usually use for $<code>\mathbb{R}_n[X]</code>$ is $<code>\{x^0, x^1, x^2, x^3, \dots\}</code>$, but you can switch the base.</p> <h2>Lagrange interpolation</h2> <p>Define $<code>n+1</code>$ polynomials like this:</p> <p>$<code>\displaystyle L_{i}(x) := \prod_{j=0 \atop j \neq i}^n \frac{x-x_j}{x_i - x_j}</code>$</p> <p>This means:</p> <p>$<code>\displaystyle L_{i}(x_i) := \prod_{j=0 \atop j \neq i}^n \frac{x_i-x_j}{x_i - x_j} = 1</code>$</p> <p>and</p> <p>$<code>\displaystyle L_{i}(x_p) := \prod_{j=0 \atop j \neq i}^n \frac{x_p-x_j}{x_i - x_j} = 0 \;\; p \in \{0, \dots, n\} \setminus \{i\}</code>$</p> <p>So the polynomial $<code>y_i \cdot L_{i}(x)</code>$ fits the point $<code>(x_i, y_i)</code>$ and is zero for all other points. This implies that </p> <p>$<code>\displaystyle p(x) = \sum_{i=0}^n y_i \cdot L_i(x)</code>$ is an interpolation of our data points. The degree of $<code>p(x)</code>$ is not higher than $<code>n</code>$. You can see that easily when you take a look at the definition of $<code>p(x)</code>$ and $<code>L_i(x)</code>$.</p> <p>The polynomials $<code>L_i(x)</code>$ form another base for $<code>\mathbb{R}_n[X]</code>$.</p> <p>Lagranges way to interpolate polynomials can be implemented like this:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">lagrangeInterpolation</span><span class="p">(</span><span class="n">points</span><span class="p">):</span> <span class="n">p</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">points</span><span class="p">)):</span> <span class="n">Li</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;y&quot;</span><span class="p">:</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;y&quot;</span><span class="p">],</span> <span class="s">&quot;polynomial&quot;</span><span class="p">:[]}</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">points</span><span class="p">)):</span> <span class="k">if</span> <span class="n">j</span> <span class="o">==</span> <span class="n">i</span><span class="p">:</span> <span class="k">continue</span> <span class="n">Li</span><span class="p">[</span><span class="s">&quot;polynomial&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s">&quot;sub&quot;</span><span class="p">:</span> <span class="n">points</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">],</span> <span class="s">&quot;divisor&quot;</span><span class="p">:</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="n">points</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span> <span class="p">})</span> <span class="n">p</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Li</span><span class="p">)</span> <span class="k">return</span> <span class="n">p</span> <span class="k">def</span> <span class="nf">evaluateLagrangePolynomial</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">Li</span> <span class="ow">in</span> <span class="n">p</span><span class="p">:</span> <span class="n">prod</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">term</span> <span class="ow">in</span> <span class="n">Li</span><span class="p">[</span><span class="s">&quot;polynomial&quot;</span><span class="p">]:</span> <span class="n">prod</span> <span class="o">*=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">term</span><span class="p">[</span><span class="s">&quot;sub&quot;</span><span class="p">])</span><span class="o">/</span><span class="n">term</span><span class="p">[</span><span class="s">&quot;divisor&quot;</span><span class="p">]</span> <span class="n">y</span> <span class="o">+=</span> <span class="n">Li</span><span class="p">[</span><span class="s">&quot;y&quot;</span><span class="p">]</span><span class="o">*</span><span class="n">prod</span> <span class="k">return</span> <span class="n">y</span> </code></pre></div> <p>Time complexity to get the polynomial: $<code>n^2 + \mathcal{O}(n)</code>$ (where $<code>n</code>$ is the number of points) Space complexity for the polynomial: $<code>\mathcal{O}(n^2)</code>$ (where $<code>n</code>$ is the number of points)</p> <p>Time complexity to evaluate the value of $<code>p(x)</code>$ for any $<code>x \in \mathbb{R}</code>$: $<code>\mathcal{O}(n^2)</code>$.</p> <h2>Newton interpolation</h2> <p>Define</p> <p>$<code>\displaystyle N_i(x) := \prod_{j=0}^{i-1} (x-x_j)</code>$</p> <p>So you know that </p> <p>$<code>N_i(x) = 0 \Leftrightarrow \exists p \in \{1, \dots, i\}: x = x_{i-p}</code>$</p> <p>So your polynomial is</p> <p>$<code>\displaystyle p(x) = \sum_{i=0}^n c_i \cdot N_i(x)</code>$</p> <p>for the correct $<code>c_i</code>$. You can do this by solving the following system of equations. Please note that you don&#39;t have to store that matrix to get those $<code>c_i</code>$, <a href="http://en.wikipedia.org/wiki/Divided_differences">divided differences</a> are better.</p> <p>$<code>\begin{pmatrix} 1 &amp; &amp; &amp; &amp; 0 \\ 1 &amp; (x_1 - x_0) &amp; &amp; &amp; \\ 1 &amp; (x_2 - x_0) &amp; (x_2 - x_0)(x_2 - x_1) &amp; &amp; \\ \vdots &amp; \vdots &amp; &amp; \ddots &amp; \\ 1 &amp; (x_n - x_0) &amp; \cdots &amp; &amp; \prod_{i=0}^{n-1}(x_n - x_i) \\ \end{pmatrix} \cdot \begin{pmatrix} c_0 \\ \vdots \\ c_n \end{pmatrix} = \begin{pmatrix} f_0 \\ \vdots \\ f_n \end{pmatrix}</code>$</p> <p>You can get this lower triangular matrix like this:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">getGaussSystemForNewton</span><span class="p">(</span><span class="n">points</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">points</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="p">):</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">j</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">j</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">]</span><span class="o">-</span><span class="n">points</span><span class="p">[</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;x&quot;</span><span class="p">])</span> <span class="k">if</span> <span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">points</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s">&quot;y&quot;</span><span class="p">]</span> <span class="k">return</span> <span class="n">A</span> </code></pre></div> <p>From my previous posts about <a href="../solving-equations-of-upper-triangular-matrices/">solving equations of upper triangular matrices</a> and <a href="../solving-equations-of-unipotent-lower-triangular-matrices/">lower unitriangular matrices</a> you know that the space complexity of this is in $<code>\Theta(n^2)</code>$.</p> <p>According to Wikipedia, you can use <a href="http://en.wikipedia.org/wiki/Horner%27s_method">Horner&#39;s method</a> to evaluate this Polynom in $`\mathcal{O}(n)$. But I really don&#39;t want to implement this today.</p> <h2>Interactive example</h2> <iframe src="../html5/polynom-interpolation.htm" width="98%" height="700px"></iframe> <ul> <li>Click to add points.</li> <li>Ctrl+Click to remove point.</li> <li>You can enter a function that is valid JavaScript in the text field.</li> </ul> Mathematische Strukturen http://martin-thoma.com/mathematische-strukturen Sun, 16 Jun 2013 16:14:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/mathematische-strukturen <p>Es gibt einen ganzen Haufen an mathematischen Strukturen. Dieser Artikel soll jeweils die Definition und bekannte Beispiele sammeln. Weitere Strukturen bzw. Beispiele k&ouml;nnen gerne in den Kommentaren genannt werden.</p> <h2>Magma</h2> <div class="definition">Sei `$M$` eine Menge und `$*:M \times M \rightarrow M$` eine auf `$M$` abgeschlossene Abbildung. Dann hei&szlig;t `$(M,*)$` ein <strong>Magma</strong>.</div> <div class="definition">Sei `$(M,*)$` ein Magma. `$(M,*)$` hei&szlig;t <strong>kommutativ</strong> `$:\Leftrightarrow \forall a, b \in M: a*b = b*a$`.</div> Ein Synonym zu &bdquo;kommutativ&ldquo; ist &bdquo;abelsch&ldquo;. Beispiele: <ul> <li>Jede Halbgruppe ist auch ein Magma.</li> <li>`$(\mathbb{Z}, -)$` ist ein Magma, aber keine Halbgruppe: `$1-(1-1) = 1-0 = 1 \neq -1 = 0-1 = (1-1)-1$`</li> <li>`$(\mathbb{R} \setminus \{0\}, : )$` ist ein Magma, aber keine Halbgruppe: `$1 : (7:7)=1:1=1 \neq \frac{1}{49} = \frac{1}{7} : 7 = (1:7):7$`</li> </ul> Gegenbeispiele: <ul> <li>`$(\mathbb{N}, : )$` ist nicht abgeschlossen, also kein Magma.</li> <li>`$(\mathbb{N}, - )$` ist nicht abgeschlossen, also kein Magma.</li> </ul> <h2>Halbgruppe</h2> <div class="definition">Sei `$(M, *)$` ein Magma. `$(M, *)$` hei&szlig;t <strong>Halbgruppe</strong> `$:\Leftrightarrow (M, *)$` ist assoziativ.</div> Eine Verkn&uuml;pfung `$*$` ist genau dann assoziativ auf einer Menge `$M$`, wenn gilt: `$\forall a,b,c \in M: (a*b)*c = a*(b*c)$` Beispiele: <ul> <li>Jedes Monoid ist auch eine Halbgruppe.</li> <li>`$(\mathbb{N}_{\geq 1}, +)$` ist eine Halbgruppe, aber kein Monoid.</li> </ul> <h2>Monoid</h2> <div class="definition">Sei `$(M, *)$` eine Halbgruppe. `$(M, *)$` hei&szlig;t <strong>Monoid</strong> `$:\Leftrightarrow (M, *)$` hat ein neutrales Element `$e_M$`</div> Ein Element `$e_M \in M$` hei&szlig;t genau dann neutral, wenn gilt: `$\forall a \in M: e_M * a = a * e_M = a$` Beispiele: <ul> <li>Jede Gruppe ist auch ein Monoid.</li> <li>`$(\mathbb{N}_{0}, +)$` ist mit 0 als Neutralelement ein Monoid, aber keine Gruppe.</li> <li>`$(\mathbb{N}_{0}, \cdot)$` ist mit 1 als Neutralelement ein Monoid, aber keine Gruppe.</li> <li>`$(\mathbb{Z}, \cdot)$` ist mit 1 als Neutralelement ein Monoid, aber keine Gruppe.</li> </ul> <h2>Gruppe</h2> <div class="definition">Sei `$(M, *)$` ein Monoid. `$(M, *)$` hei&szlig;t <strong>Gruppe</strong> `$:\Leftrightarrow \forall a \in M: \exists a^{-1} \in M: a * a^{-1} = a^{-1} * a = e_M$` </div> Beispiele: <ul> <li>Jeder Ring `$(R, +, \cdot)$` beinhaltet eine Gruppe `$(R, +)$`.</li> <li>`$(\mathbb{Q}, +)$`</li> <li>`$(\mathbb{R}, +)$`</li> <li>`$(\mathbb{Q} \setminus \{0\}, \cdot)$`</li> <li>`$(\mathbb{R} \setminus \{0\}, \cdot)$`</li> </ul> <h2>Ring</h2> <div class="definition">Sei `$R$` eine Menge und `$+:R \times R \rightarrow R$`, `$\cdot:R \times R \rightarrow R$` Verkn&uuml;pfungen darauf. `$(R, +, \cdot)$` hei&szlig;t <strong>Ring</strong> `$:\Leftrightarrow$` <ul> <li>`$(R,+)$` ist eine kommutative Gruppe (das Neutralelement hei&szlig;e 0),</li> <li>`$(R,\cdot)$` ist eine Halbgruppe und</li> <li>die Distributivgesetze sind erf&uuml;llt.</li> </ul> </div> <p>Die Distributivgesetze lauten:</p> <p><code>$\forall a,b,c,d \in R: (a+b) \cdot c = ac + bc$</code></p> <p>und</p> <p><code>$\forall a,b,c,d \in R: a \cdot (c+d) = ac + ad$</code></p> <p>Au&szlig;erdem:</p> <div class="definition">Sei `$(R,+,\cdot)$` ein Ring. `$(R,+,\cdot)$` hei&szlig;t <strong>Ring mit Eins</strong> `$:\Leftrightarrow (R, \cdot)$` ist Monoid. </div> <div class="definition">Sei `$(R,+,\cdot)$` ein Ring. `$(R,+,\cdot)$` hei&szlig;t <strong>kommutativer Ring</strong> `$:\Leftrightarrow (R, \cdot)$` ist kommutativ. </div> <p>Beispiele: <ul> <li>Jeder K&ouml;rper ist auch ein Ring.</li> <li><code>$(\mathbb{Z}, +, \cdot)$</code> ist ein kommutativer Ring mit Eins, aber kein K&ouml;rper. Es fehlen die Inversen bei der Multiplikation.</li> </ul></p> <h2>K&ouml;rper</h2> <div class="definition">Sei `$(K, +, \cdot)$` ein kommutativer Ring mit Eins. `$(K, +, \cdot)$` hei&szlig;t <strong>K&ouml;rper</strong> `$:\Leftrightarrow$` <ul> <li>`$(K,+)$` ist kommutativ.</li> <li>`$(K \setminus \{0\}, \cdot)$` ist kommutative Gruppe.</li> </ul> </div> <p>Beispiele: <ul> <li><code>$(\mathbb{Q}, +, \cdot)$</code></li> <li><code>$(\mathbb{R}, +, \cdot)$</code></li> <li><code>$(\mathbb{C}, +, \cdot)$</code></li> <li><code>$(\mathbb{Z} / p \mathbb{Z}, +, \cdot)$</code>, wobei <code>$p$</code> eine Primzahl ist</li> </ul></p> <h2>Modul</h2> <div class="definition">Sei `$(R, +_R, \cdot_R)$` ein Ring und `$(M, +_M)$` eine kommutative Gruppe. Au&szlig;erdem sei `$\cdot_V: R \times M \rightarrow M$` eine Abbildung. `$(M, R, \cdot_V)$` hei&szlig;t <strong>R-Modul</strong> `$:\Leftrightarrow \forall \lambda, \mu \in R \; x,y \in M:$` <ul> <li>`$1_R \cdot x = x$`</li> <li>`$\lambda \cdot (\mu \cdot x) = (\lambda \cdot \mu) \cdot x$`</li> <li>`$(\lambda + \mu) \cdot x = \lambda \cdot x + \mu \cdot x$`</li> <li>`$\lambda \cdot (x+y) = \lambda \cdot x + \lambda \cdot y$`</li> </ul> </div> <p>Beispiele: <ul> <li>Jeder K-Vektorraum ist auch ein K-Modul.</li> <li>Das <code>$\mathbb{Z}$</code>-Modul <code>$\mathbb{Z}/2 \mathbb{Z}$</code> ist ein Modul ohne Basis, also kein Vektorraum.</li> </ul></p> <h2>Vektorraum</h2> <div class="definition">Sei `$(K, +_K, \cdot_K)$` ein K&ouml;rper und `$(V,+_V)$` eine kommutative Gruppe. Au&szlig;erdem sei `$\cdot_V: K \times V \rightarrow V$` eine <strong>skalalre Multiplikation</strong>. `$(V, K, \cdot_V)$` hei&szlig;t <strong>`$K$`-Vektorraum</strong> `$:\Leftrightarrow \forall \lambda, \mu \in K \; x,y \in V:$` <ul> <li>`$1_K \cdot x = x$`</li> <li>`$\lambda \cdot (\mu \cdot x) = (\lambda \cdot \mu) \cdot x$`</li> <li>`$(\lambda + \mu) \cdot x = \lambda \cdot x + \mu \cdot x$`</li> <li>`$\lambda \cdot (x+y) = \lambda \cdot x + \lambda \cdot y$`</li> </ul> </div> <p>Beispiele: <ul> <li><code>$(\mathbb{R}[X], \mathbb{R}, \cdot_V)$</code>: Der Vektorraum der polynome mit Koeffizienten aus <code>$\mathbb{R}$</code>.</li> </ul></p> <h2>Weitere</h2> <h3>Ideal</h3> <div class="definition">Ein Ideal in einem Ring `$(R, +, \cdot)$` ist eine Teilmenge `$I \subseteq R$`, die bez&uuml;glich der Addition eine Untergruppe ist und die folgende Eigenschaft hat: `$\forall x \in I, r \in R: xr \in I \text{ und } rx \in I$`</div> <p>Beispiele: <ul> <li>Kerne von Ringhomomorphismen sind immer Ideale. (Und Ideale sind Kerne von Ringhomomorphismen.)</li> </ul></p> <h3>Algebra</h3> <div class="definition">Es sei `$R$` ein Ring. Eine `$R$`-Algebra ist ein Ring `$A$` zusammen mit einem Ringhomomorphismus `$\sigma: R \rightarrow A$`, sodass gilt: `$\forall r \in R, a \in A: \sigma(r) \cdot a = a \cdot \sigma(r)$`</div> <p>Beispiele: <ul> <li>Jeder Ring ist eine <code>$\mathbb{Z}$</code>-Algebra.</li> </ul></p> <h3>Integrit&auml;tsring</h3> <div class="definition">Es sei `$R$` ein vom Null-Ring verschiedener Ring. `$R$` hei&szlig;t integrit&auml;tsring `$:\Leftrightarrow R$` ist kommuativ und Nullteilerfrei.</div> <p>Beispiele: <ul> <li>Zu dem Ring <code>$(\mathbb{Z}, +, \cdot)$</code> ist <code>$(\mathbb{Q}, +, \cdot)$</code> ein Quotientenk&ouml;rper.</li> </ul></p> <h3>Hauptidealring</h3> <div class="definition">Es sei `$R$` ein Integrit&auml;tsring. `$R$` hei&szlig;t Hauptidealring `$:\Leftrightarrow$` Jedes Ideal `$I \subseteq R$` ist ein Hauptideal.</div> <h3>Quotientenk&ouml;rper</h3> <div class="definition">Es sei `$R$` ein Integrit&auml;tsring. Der kleinste K&ouml;rper, in den `$R$` eingebettet werden kann, wird der Quotientenk&ouml;rper des Integrit&auml;tsrings genannt.</div> <p>Beispiele: <ul> <li>Jeder K&ouml;rper ist ein Integrit&auml;tsring.</li> <li><code>$(\mathbb{Z}, +, \cdot)$</code></li> </ul></p> <h2>Hilfsbegriffe</h2> <h3>Ideal</h3> <div class="definition">Sei `$(R, +, \cdot)$` ein Ring und `$I \subseteq R$`. `$I$` hei&szlig;t Ideal `$:\Leftrightarrow$` <ol style="list-style-type:lower-roman"> <li>`$(I, +)$` ist eine Gruppe,</li> <li>`$\forall r \in R \forall a \in I: r \cdot a \in I$` und</li> <li>`$\forall r \in R \forall a \in I: a \cdot r \in I$`.</li> </ol></div> <p>Beispiele: <ul> <li>Die Menge <code>$2\mathbb{Z}$</code> der geraden ganzen Zahlen ist ein Ideal im Ring<code>$(\mathbb{Z}, +, \cdot)$</code>.</li> </ul></p> <h3>Hauptideal</h3> <div class="definition">Sei `$(R, +, \cdot)$` ein Ring und `$I \subseteq R$` ein Ideal. `$I$` hei&szlig;t Hauptideal `$:\Leftrightarrow I$` wird von einem Element erzeugt.</div> <p>Beispiele: <ul> <li><code>$n\mathbb{Z}$</code></li> </ul></p> <h3>Primideal</h3> <div class="definition">Sei `$(R, +, \cdot)$` ein Ring und `$I \subsetneq R$` ein Ideal. `$I$` hei&szlig;t Primideal in `$R :\Leftrightarrow \forall x, y \in R: xy \in I \Rightarrow x \in I \lor y \in I$`</div> <p>Beispiele: <ul> <li><code>$2\mathbb{Z}$</code> ist Primideal in <code>$(\mathbb{Z}, +, \cdot)$</code></li> </ul></p> <h3>Maximales Ideal</h3> <div class="definition">Sei `$(R, +, \cdot)$` ein Ring und `$I \subsetneq R$` ein Ideal. `$I$` hei&szlig;t maximales Ideal in `$R :\Leftrightarrow$` Es gibt kein Ideal `$J$`, f&uuml;r das gilt: `$I \subsetneq J \subsetneq R$`</div> <p>Beispiele: <ul> <li>In <code>$(\mathbb{Z},+,\cdot)$</code> ist jedes Primideal maximal.</li> </ul></p> Structs in C++ http://martin-thoma.com/structs-in-c Fri, 07 Jun 2013 14:25:18 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/structs-in-c <p>I guess this article isn&#39;t very interesting, except if you have VERY little experience with C / C++. I only give some complete code examples. If you want some text, you could read <a href="http://en.wikibooks.org/wiki/C%2B%2B_Programming/Structures">C++ Programming/Structures</a> (a wikibook).</p> <h2>Point</h2> <h3>Basic example</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">x</span><span class="p">;</span> <span class="kt">double</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">Point</span> <span class="n">a</span> <span class="o">=</span> <span class="p">{</span><span class="mi">12</span><span class="p">,</span> <span class="mi">34</span><span class="p">};</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h3>Functions</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define ABS(a) (a &lt; 0 ? -(a) : a)</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">x</span><span class="p">;</span> <span class="kt">double</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span> <span class="kt">double</span> <span class="nf">getManhattanDistance</span><span class="p">(</span><span class="n">Point</span> <span class="n">a</span><span class="p">,</span> <span class="n">Point</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">Point</span> <span class="n">a</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">};</span> <span class="n">Point</span> <span class="n">b</span> <span class="o">=</span> <span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">};</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Distance: %.2f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">getManhattanDistance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>More stuff</h2> <h3>Initialization</h3> <p><code>Point a = {}</code> initializes all values of point to 0.</p> <h3>Constructors</h3> <p>You can write constructors for structs:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define ABS(a) (a &lt; 0 ? -(a) : a)</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">x</span><span class="p">;</span> <span class="kt">double</span> <span class="n">y</span><span class="p">;</span> <span class="n">Point</span><span class="p">()</span><span class="o">:</span><span class="n">x</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mf">5.0</span><span class="p">)</span> <span class="p">{}</span> <span class="n">Point</span><span class="p">(</span><span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="kt">double</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span><span class="n">x</span><span class="p">(</span><span class="mf">9.0</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mf">9.0</span><span class="p">)</span> <span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="n">a</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">b</span><span class="p">;}</span> <span class="p">};</span> <span class="kt">double</span> <span class="nf">getManhattanDistance</span><span class="p">(</span><span class="n">Point</span> <span class="n">a</span><span class="p">,</span> <span class="n">Point</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">Point</span> <span class="n">a</span> <span class="o">=</span> <span class="p">{};</span> <span class="n">Point</span> <span class="n">b</span> <span class="o">=</span> <span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">};</span> <span class="n">Point</span> <span class="n">c</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">c</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">c</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Distance: %.2f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">getManhattanDistance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Which gives:</p> <div class="highlight"><pre><code class="bash">./struct-example.out <span class="o">(</span>2.00<span class="p">|</span>5.00<span class="o">)</span> <span class="o">(</span>3.00<span class="p">|</span>-4.00<span class="o">)</span> <span class="o">(</span>2.00<span class="p">|</span>5.00<span class="o">)</span> Distance: 10.00 </code></pre></div> <h3>Functions in structs</h3> <p>You can also add functions to structs:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define ABS(a) (a &lt; 0 ? -(a) : a)</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">x</span><span class="p">;</span> <span class="kt">double</span> <span class="n">y</span><span class="p">;</span> <span class="n">Point</span><span class="p">()</span><span class="o">:</span><span class="n">x</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mf">5.0</span><span class="p">)</span> <span class="p">{}</span> <span class="n">Point</span><span class="p">(</span><span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="kt">double</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span><span class="n">x</span><span class="p">(</span><span class="mf">9.0</span><span class="p">),</span><span class="n">y</span><span class="p">(</span><span class="mf">9.0</span><span class="p">)</span> <span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="n">a</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">b</span><span class="p">;}</span> <span class="kt">double</span> <span class="n">getZeroDist</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">ABS</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">+</span><span class="n">ABS</span><span class="p">(</span><span class="n">y</span><span class="p">);</span> <span class="p">}</span> <span class="p">};</span> <span class="kt">double</span> <span class="nf">getManhattanDistance</span><span class="p">(</span><span class="n">Point</span> <span class="n">a</span><span class="p">,</span> <span class="n">Point</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="o">-</span><span class="n">b</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">Point</span> <span class="n">a</span> <span class="o">=</span> <span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">10</span><span class="p">};</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;(%.2f|%.2f)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Distance: %.2f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">getZeroDist</span><span class="p">());</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Result:</p> <div class="highlight"><pre><code class="bash">./struct-example.out <span class="o">(</span>3.00<span class="p">|</span>-10.00<span class="o">)</span> Distance: 13.00 </code></pre></div> <h2>Read also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Struct_(C_programming_language)">struct (C programming language)</a></li> <li><a href="../cpp-operator-overloading/" title="C++ Operator overloading">Operator overloading</a></li> <li><a href="../a-practical-approach-to-floats/">A practical approach to floats</a>: An example for union</li> <li><a href="../how-do-hash-functions-work/">Connect four</a>: One usage example for structs</li> </ul> <p>Is there anything interesting to say about structs?</p> Calculate square roots http://martin-thoma.com/calculate-square-roots Thu, 06 Jun 2013 18:54:10 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/calculate-square-roots <p>Suppose you have an equation like this:</p> <p><code>$x^2 = a, \;\;\;\; a \in \mathbb{R}_{\geq 0}$</code></p> <p>Your task is to compute the solution <code>$x \in \mathbb{R}_{\geq 0}$</code>.</p> <p>How do you solve this algorithmically?</p> <h2>Input and output</h2> <p>Write a program that takes two parameters <code>$a, n \in \mathbb{N}_{\geq 1}$</code>: <ul> <li><code>$a$</code>: The number you should take the square root of. <code>$a$</code> is not bigger than 65535. To make this a little bit simpler, you can also assume that <code>$a$</code> is an integer.</li> <li><code>$n$</code>: Number of iterations you may use</li> </ul></p> <p>Your program should output exactly one positive floating point number. The decimal separator is a point. At the end of the number should be a newline character <code>\n</code>.</p> <h2>Reference code</h2> <div class="highlight"><pre><code class="c"><span class="c1">// Thanks to http://stackoverflow.com/a/15363123/562769</span> <span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;gmp.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="kt">mpf_t</span> <span class="n">res</span><span class="p">,</span> <span class="n">a</span><span class="p">;</span> <span class="n">mpf_set_default_prec</span><span class="p">(</span><span class="mi">1000000</span><span class="p">);</span> <span class="c1">// Increase this number.</span> <span class="n">mpf_init</span><span class="p">(</span><span class="n">res</span><span class="p">);</span> <span class="n">mpf_init</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="n">mpf_set_str</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">&quot;2&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span> <span class="n">mpf_sqrt</span> <span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span> <span class="n">gmp_printf</span><span class="p">(</span><span class="s">&quot;%.1000Ff</span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">res</span><span class="p">);</span> <span class="c1">// Increase this number.</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>You need <a href="http://gmplib.org/manual">GMP</a> (<code>libgmp-dev</code>) to compile this. </p> <p>Compile it like this:</p> <div class="highlight"><pre><code class="bash">gcc sqrt-reference.c -lgmp -lm -O0 -g3 -o reference.out </code></pre></div> <p>This is the script I use to get the number of correct digits:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">getScore</span><span class="p">(</span><span class="n">program</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">os</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&quot;./reference.out &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; &gt; reference.txt&quot;</span><span class="p">)</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s">&quot;./&quot;</span> <span class="o">+</span> <span class="n">program</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; &gt; result.txt&quot;</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;reference.txt&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="n">reference</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;result.txt&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">points</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">areEqual</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">while</span> <span class="n">reference</span><span class="p">[</span><span class="n">points</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span> <span class="ow">and</span> <span class="n">result</span><span class="p">[</span><span class="n">points</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">:</span> <span class="k">if</span> <span class="n">reference</span><span class="p">[</span><span class="n">points</span><span class="p">]</span> <span class="o">==</span> <span class="n">result</span><span class="p">[</span><span class="n">points</span><span class="p">]:</span> <span class="n">points</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="n">points</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span> <span class="n">points</span> <span class="o">-=</span> <span class="mi">1</span> <span class="c"># decimal point</span> <span class="k">return</span> <span class="n">points</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">()</span> <span class="c"># Add more options if you like</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-p&quot;</span><span class="p">,</span> <span class="s">&quot;--program&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;program&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;your program&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-a&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&#39;A&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;calculate squre root of a&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-n&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&#39;N&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;maximum n iterations&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Points for a=</span><span class="si">%i</span><span class="s"> and n=</span><span class="si">%i</span><span class="s">: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">n</span><span class="p">,</span> <span class="n">getScore</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">program</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">n</span><span class="p">)))</span> </code></pre></div> <h2>Newton's method</h2> <p>How should be choose the initial value? I thought <code>$\frac{a}{2}$</code> could be ok. In a good implementation you&#39;ll probably do this with a lookup table.</p> <p>With long double:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;cmath&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="nf">newton</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">x</span> <span class="o">=</span> <span class="p">((</span><span class="kt">long</span> <span class="kt">double</span><span class="p">)</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="o">-</span> <span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Please enter exactly two arguments.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.80Lf</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">newton</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>I failed to convert this to a version that uses GMP :-/</p> <p>But it converges quite fast:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/06/newton-correct-digits.png"><img src="../images/2013/06/newton-correct-digits.png" alt="" width="512" height="235" class="size-full wp-image-69511"/></a><p class="wp-caption-text"></p></div> <h2>Exponential identity</h2> <p>According to Wikipedia (Source: <a href="http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Exponential_identity">Methods of computing square roots</a>) many calculators use the following identity:</p> <p><code>$\displaystyle \sqrt{a} = e^{\frac{1}{2}\ln a}$</code></p> <p>But to calculate this, you need to be able to calculate <code>$e^x$</code> for <code>$x \in \mathbb{R}_{\geq 0}$</code> and <code>$\ln(a)$</code> for <code>$a \in \mathbb{R}_{\geq 0}$</code>.</p> <p>I&#39;ve used the definition of <code>$e^x$</code> to calculate <code>$e^x$</code>: <code>$\displaystyle e^x := \sum_{i = 0}^\infty \frac{x^i}{i!}$</code></p> <p>and:</p> <p><code>$\displaystyle \ln(1+x) =- \sum_{k=0}^\infty \frac{(-x)^{k+1}}{k+1}$</code></p> <p>So I gave it a try:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;cmath&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="nf">ln</span><span class="p">(</span><span class="kt">int</span> <span class="n">S</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">S</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">result</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">sign</span> <span class="o">=</span> <span class="mf">1.0</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">tmp</span> <span class="o">*=</span> <span class="p">(</span><span class="n">S</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="n">sign</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">result</span> <span class="o">+=</span> <span class="n">sign</span><span class="o">*</span><span class="n">tmp</span><span class="o">/</span><span class="n">i</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">result</span><span class="p">;</span> <span class="p">}</span> <span class="kt">long</span> <span class="kt">double</span> <span class="nf">e</span><span class="p">(</span><span class="kt">long</span> <span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">numerator</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">denominator</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">numerator</span> <span class="o">*=</span> <span class="n">x</span><span class="p">;</span> <span class="n">denominator</span> <span class="o">*=</span> <span class="n">i</span><span class="p">;</span> <span class="n">result</span> <span class="o">+=</span> <span class="n">numerator</span><span class="o">/</span><span class="n">denominator</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">result</span><span class="p">;</span> <span class="p">}</span> <span class="kt">long</span> <span class="kt">double</span> <span class="nf">sqrt</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">e</span><span class="p">(</span><span class="n">ln</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span><span class="o">*</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Please enter exactly two arguments.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.80Lf</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>This converges VERY slow: For <code>$a = 2$</code></p> <ul> <li>`$n=1$`: 1 digit correct</li> <li>`$n=10$`: 1 digit correct</li> <li>`$n=100$`: 2 digits correct</li> <li>`$n=1000$`: 4 digit correct</li> <li>`$n=10,000$`: 5 digit correct</li> <li>`$n=100,000$`: 5 digit correct</li> <li>`$n=1,000,000$`: 6 digit correct</li> </ul> <p>Ok, lets take a better Taylor series for calculating <code>$e^x$</code>: <code>$\displaystyle e^x = \sum_{k=0}^\infty \frac{x^{-1+2 k} (2 \cdot k+x)}{(2\cdot k)!}$</code></p> <p>This didn&#39;t change anything! I&#39;m very surprised ... as I&#39;ve calculated <code>$\pi$</code> for another article, changing the series to something similar improved the speed of convergence drastically.</p> <h2>See also</h2> <ul> <li>StackOverflow: <a href="http://stackoverflow.com/a/12304868/562769">How does the computer calculate Square roots?</a></li> <li><a href="http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html">Intel&reg; 64 and IA-32 Architectures Software Developer&rsquo;s Manual</a>: FSQRT, SQRTPS, SQRTSS</li> <li><a href="https://github.com/MartinThoma/algorithms/tree/master/square-root-calculation">Source code</a> of this article</li> </ul> <p>Feel free to add a program that calculates square roots. When they are interesting, I&#39;ll probably add them to this article.</p> Inverting matrices http://martin-thoma.com/inverting-matrices Sun, 02 Jun 2013 12:01:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/inverting-matrices <p>Suppose you have a matrix <code>$A \in \mathbb{R}^{n \times n}$</code> and you want to invert it. I&#39;ve already explained <a href="../wie-bestimme-ich-das-inverse-einer-matrix/">how to invert a matrix</a> (<a href="http://www.purplemath.com/modules/mtrxinvr.htm">English explanation</a>), but I didn&#39;t provide any code and / or runtime analysis.</p> <h2>C++ Code</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;cmath&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;| &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">calculateInverse</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">A</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Search for maximum in this column</span> <span class="kt">double</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="n">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span> <span class="kt">int</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">maxEl</span><span class="p">)</span> <span class="p">{</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">k</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Swap maximum row with current row (column by column)</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span><span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">];</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">];</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Make all rows below this one 0 in current column</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="n">j</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">c</span> <span class="o">*</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Solve equation Ax=b for an upper triangular matrix A</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span><span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">/=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="p">}</span> <span class="c1">// this is not necessary, but the output looks nicer:</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">rowModify</span><span class="o">=</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span><span class="n">rowModify</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span> <span class="n">rowModify</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">columModify</span><span class="o">=</span><span class="n">n</span><span class="p">;</span><span class="n">columModify</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">;</span><span class="n">columModify</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">rowModify</span><span class="p">][</span><span class="n">columModify</span><span class="p">]</span> <span class="o">-=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">columModify</span><span class="p">]</span> <span class="o">*</span> <span class="n">A</span><span class="p">[</span><span class="n">rowModify</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="p">}</span> <span class="c1">// this is not necessary, but the output looks nicer:</span> <span class="n">A</span><span class="p">[</span><span class="n">rowModify</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">line</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">line</span><span class="p">);</span> <span class="c1">// Read input data</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Print input</span> <span class="n">print</span><span class="p">(</span><span class="n">A</span><span class="p">);</span> <span class="c1">// Calculate solution</span> <span class="n">calculateInverse</span><span class="p">(</span><span class="n">A</span><span class="p">);</span> <span class="c1">// Print result</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Result:&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">print</span><span class="p">(</span><span class="n">A</span><span class="p">);</span> <span class="p">}</span> </code></pre></div> <p>This code is VERY similar to the code of <a href="../solving-linear-equations-with-gaussian-elimination/" title="Solving linear equations with Gaussian elimination">Gaussian elimination</a>. In fact, I&#39;ve only changed all occurrences of <code>n+1</code> to <code>2*n</code>. I also had to change lines 57-70, as we need to do all operations now on a matrix instead of a vector.</p> <h3>Time complexity</h3> <p>Lines 43-52:</p> <p><code>$\displaystyle Operations = \sum_{i=0}^{n-1} \left (\sum_{k=i+1}^{n-1} (\sum_{j=i}^{2n} 1) \right ) = \frac{5}{6} n^3 - \frac{5}{6} n$</code> (see <a href="http://www.wolframalpha.com/input/?i=sum_%7Bi%3D0%7D%5E%7Bn-1%7D+(sum_%7Bk%3Di%2B1%7D%5E%7Bn-1%7D+(sum_%7Bj%3Di%7D%5E%7B2n%7D+1))">Wolfram|Alpha</a>)</p> <p>Lines 63-70:</p> <p><code>$\displaystyle Operations = \sum_{i=0}^{n-1} \left (\sum_{k=0}^{i-1} (\sum_{j=n}^{2n} 1) \right ) = \frac{1}{2} n^3 - \frac{1}{2} n$</code> (see <a href="http://www.wolframalpha.com/input/?i=sum_%7Bi%3D0%7D%5E%7Bn-1%7D+%28sum_%7Bk%3D0%7D%5E%7Bi-1%7D+%28sum_%7Bj%3Dn%7D%5E%7B2n%7D+1%29%29"))">Wolfram|Alpha</a>)</p> <p>So we need about <code>$\frac{4}{3} n^3 + \mathcal{O}(n^2)$</code> operations to invert a matrix with Gau&szlig;-Elimination. </p> <h3>Space complexity</h3> <p>My algorithm needs space for the inverse matrix, so it is in <code>$\mathcal{O}(n^2)$</code>.</p> <h2>Inverting an upper triangular matrix</h2> <p>Suppose you have an upper triangular matrix <code>$A \in \mathbb{R^{n \times n}}$</code> that you would like to invert. It could look like this:</p> <p><code>$\begin{pmatrix} 2 &amp; 7 &amp; 1 &amp; 8 &amp; 2\\ 0 &amp; 8 &amp; 1 &amp; 8 &amp; 2\\ 0 &amp; 0 &amp; 8 &amp; 4 &amp; 5\\ 0 &amp; 0 &amp; 0 &amp; 9 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 4 \end{pmatrix}$</code></p> <p>How could we improve the algorithm from above to get speed it up?</p> <p>Well, we don&#39;t need lines 24-53 any more, as those lines bring <code>$A$</code> to an upper triangular form. But we still need lines 63-70. So we can improve the algorithm to a complexity of <code>$\frac{1}{2} n^3 + \mathcal{O}(n^2)$</code>.</p> <h2>See also</h2> <p><a href="http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations#Matrix_algebra">Computational complexity of mathematical operations</a></p> Fractions in C++ http://martin-thoma.com/fractions-in-cpp Sat, 01 Jun 2013 10:00:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/fractions-in-cpp <p>Today, I thought I should try to implement a class in C++ that deals with fractions. This is actually quite easy as I&#39;ll show you.</p> <h2>First some math</h2> <h3>Names</h3> <p>When you have a fraction <code>$\frac{a}{b}$</code> then <code>$a$</code> is called <em>numerator</em> and <code>$b$</code> is called <em>denominator</em>.</p> <h3>Operations</h3> <p>The rules for basic operations are simple:</p> <p>Addition: <code>$\frac{a}{b} + \frac{c}{d} = \frac{a \cdot d + c \cdot b}{b \cdot d}$</code></p> <p>Subtraction: <code>$\frac{a}{b} - \frac{c}{d} = \frac{a \cdot d - c \cdot b}{b \cdot d}$</code></p> <p>Multiplication: <code>$\frac{a}{b} \cdot \frac{c}{d} = \frac{a \cdot c}{b \cdot d}$</code></p> <p>Division: <code>$\frac{a}{b} : \frac{c}{d} = \frac{a \cdot d}{b \cdot c}$</code></p> <h3>Euklids algorithm</h3> <p>You can calculate the greatest common divisor with <a href="http://en.wikipedia.org/wiki/Euclidean_algorithm">Euklids algorithm</a>. If you don&#39;t know it, please read the Wikipedia article.</p> <p>Knowing the greatest common divisor is important, because we want that our Faction class automatically cancels those factors so that the numerator and denominator are as small as possible.</p> <h2>C++ Code</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">class</span> <span class="nc">Fraction</span> <span class="p">{</span> <span class="nl">private:</span> <span class="c1">// Calculates the greates common divisor with </span> <span class="c1">// Euclid&#39;s algorithm</span> <span class="c1">// both arguments have to be positive</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">gcd</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">a</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">while</span> <span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="n">a</span> <span class="o">-=</span> <span class="n">b</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">b</span> <span class="o">-=</span> <span class="n">a</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">a</span><span class="p">;</span> <span class="p">}</span> <span class="nl">public:</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">numerator</span><span class="p">,</span> <span class="n">denominator</span><span class="p">;</span> <span class="n">Fraction</span><span class="p">()</span> <span class="p">{</span> <span class="n">numerator</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">denominator</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">d</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">d</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Denominator may not be 0.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">numerator</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">denominator</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">sign</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">sign</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">n</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">d</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">sign</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">d</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">);</span> <span class="n">numerator</span> <span class="o">=</span> <span class="n">n</span><span class="o">/</span><span class="n">tmp</span><span class="o">*</span><span class="n">sign</span><span class="p">;</span> <span class="n">denominator</span> <span class="o">=</span> <span class="n">d</span><span class="o">/</span><span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">operator</span> <span class="kt">int</span><span class="p">()</span> <span class="p">{</span><span class="k">return</span> <span class="p">(</span><span class="n">numerator</span><span class="p">)</span><span class="o">/</span><span class="n">denominator</span><span class="p">;}</span> <span class="k">operator</span> <span class="kt">float</span><span class="p">()</span> <span class="p">{</span><span class="k">return</span> <span class="p">((</span><span class="kt">float</span><span class="p">)</span><span class="n">numerator</span><span class="p">)</span><span class="o">/</span><span class="n">denominator</span><span class="p">;}</span> <span class="k">operator</span> <span class="kt">double</span><span class="p">()</span> <span class="p">{</span><span class="k">return</span> <span class="p">((</span><span class="kt">double</span><span class="p">)</span><span class="n">numerator</span><span class="p">)</span><span class="o">/</span><span class="n">denominator</span><span class="p">;}</span> <span class="p">};</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">+</span><span class="p">(</span><span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span> <span class="o">+</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">+=</span><span class="p">(</span><span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span> <span class="o">+</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="n">lhs</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">-</span><span class="p">(</span><span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span> <span class="o">-</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">-=</span><span class="p">(</span><span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span> <span class="o">-</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="n">lhs</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">*=</span><span class="p">(</span><span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="n">lhs</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="p">,</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">,</span> <span class="kt">int</span> <span class="n">lhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="p">,</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">Fraction</span> <span class="k">operator</span><span class="o">/</span><span class="p">(</span><span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">tmp</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">numerator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">denominator</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">denominator</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">numerator</span><span class="p">);</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">strm</span><span class="p">,</span> <span class="k">const</span> <span class="n">Fraction</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">denominator</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">strm</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">numerator</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">strm</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">numerator</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;/&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">denominator</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">strm</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">Fraction</span> <span class="n">a</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span> <span class="n">Fraction</span> <span class="nf">b</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">28</span><span class="p">);</span> <span class="n">Fraction</span> <span class="n">c</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be 37/84)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be 19/84)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be 1/28)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be 28/9)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be -3/28)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be -3/28)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">Fraction</span><span class="p">(</span><span class="o">-</span><span class="mi">100</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be -33)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span><span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be -33.3...)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">c</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be -33.3...)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">a</span> <span class="o">-=</span> <span class="n">b</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">a</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">(should be 19/84)&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <p>You might also be interested in my article about <a href="../cpp-operator-overloading/" title="C++ Operator overloading">operator overloading</a>.</p> <p>Does anybody know if there is an &quot;official&quot; Fraction class?</p> Solving linear equations with Gaussian elimination http://martin-thoma.com/solving-linear-equations-with-gaussian-elimination Sat, 25 May 2013 22:01:30 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/solving-linear-equations-with-gaussian-elimination <div class="info">Please note that you should use LU-decomposition to solve linear equations. The following code produces valid solutions, but when your vector `$b$` changes you have to do all the work again. LU-decomposition is faster in those cases and not slower in case you don't have to solve equations with the same matrix twice.</div> <p>Suppose you have a system of <code>$n \in \mathbb{N_{\geq 1}}$</code> linear equations and variables <code>$x_1, x_2, \dots, x_n \in \mathbb{R}$</code>:</p> <p><code>$ \begin{align} a_{1,1} \cdot x_1 + a_{1,2} x_2 + \dots + a_{1,n} \cdot x_{n} &amp;= b_1\\ a_{2,1} \cdot x_1 + a_{2,2} x_2 + \dots + a_{2,n} \cdot x_{n} &amp;= b_2\\ \vdots &amp;= \vdots\\ a_{n,1} \cdot x_1 + a_{n,2} x_2 + \dots + a_{n,n} \cdot x_{n} &amp;= b_n \end{align} $</code></p> <p>All factors <code>$a_{i,j} \in \mathbb{R}$</code> for <code>$i,j \in 1, \dots, n$</code> can be written in one matrix <code>$A \in \mathbb{R}^{n \times n}$</code> and all <code>$b_i$</code> can be written as a vector <code>$b$</code>. You combine all <code>$x_i$</code> in the same way to a vector <code>$x$</code>.</p> <p>So you can write the system of equations as:</p> <p><code>$A \cdot x = b$</code></p> <h2>How Gaussian elimination works</h2> <p>First, you write <code>$A$</code> and <code>$b$</code> in an augmented matrix <code>$A|b$</code>:</p> <p><code>$ \left(\begin{array}{cccc|c} a_{1,1} &amp; a_{1,2} &amp; \dots &amp; a_{1,n} &amp; b_1\\ a_{2,1} &amp; a_{2,2} &amp; \dots &amp; a_{2,n} &amp; b_2\\ \vdots &amp; \vdots &amp; \ddots &amp; \vdots &amp; \vdots \\ a_{n,1} &amp; a_{n,2} &amp; \dots &amp; a_{n,n} &amp; b_n \end{array}\right). $</code></p> <p>On this matrix you may make exactly three operations:</p> <ul> <li>Swap rows</li> <li>Add one row onto another</li> <li>Multiply every factor of one row with a constant</li> </ul> <p>You want to get a triangular matrix. So you subsequently eliminate one variable from the system of equations until you have a matrix like this:</p> <p><code>$ \left(\begin{array}{ccccc|c} a_{1,1} &amp; a_{1,2} &amp; a_{1,3} &amp; \dots &amp; a_{1,n} &amp; b_1\\ 0 &amp; a_{2,2} &amp; a_{2,3} &amp; \dots &amp; a_{2,n} &amp; b_2\\ 0 &amp; 0 &amp; a_{3,3} &amp; \dots &amp; a_{3,n} &amp; b_3\\ \vdots &amp; \vdots &amp; \ddots &amp; \ddots&amp; \vdots &amp; \vdots\\ 0 &amp; 0 &amp; \dots &amp; 0 &amp; a_{3,n} &amp; b_n\\ \end{array}\right). $</code></p> <p>It&#39;s actually quite simple to get this form:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/05/Gaussian-elimination.png"><img src="../images/2013/05/Gaussian-elimination.png" alt="" width="500" height="772" class="size-full wp-image-68071"/></a><p class="wp-caption-text"></p></div> <h2>C++ Code</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;cmath&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;| &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">gauss</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Search for maximum in this column</span> <span class="kt">double</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="n">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span> <span class="kt">int</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">maxEl</span><span class="p">)</span> <span class="p">{</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="n">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">k</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Swap maximum row with current row (column by column)</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span><span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">];</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">];</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Make all rows below this one 0 in current column</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="n">j</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">c</span> <span class="o">*</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Solve equation Ax=b for an upper triangular matrix A</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">x</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span><span class="n">k</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> <span class="o">-=</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">line</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">line</span><span class="p">);</span> <span class="c1">// Read input data</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="p">];</span> <span class="p">}</span> <span class="c1">// Print input</span> <span class="n">print</span><span class="p">(</span><span class="n">A</span><span class="p">);</span> <span class="c1">// Calculate solution</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">x</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="n">x</span> <span class="o">=</span> <span class="n">gauss</span><span class="p">(</span><span class="n">A</span><span class="p">);</span> <span class="c1">// Print result</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Result:</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>You can call it like this:</p> <div class="highlight"><pre><code class="bash">./gauss.out &lt; 3x3.in 1 2 3 <span class="p">|</span> 1 4 5 6 <span class="p">|</span> 1 1 0 1 <span class="p">|</span> 1 Result: 0 -1 1 </code></pre></div> <h2>Python code</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">pprint</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">line</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">if</span> <span class="n">j</span> <span class="o">==</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">line</span> <span class="o">+=</span> <span class="s">&quot;| &quot;</span> <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">gauss</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="c"># Search for maximum in this column</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">i</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">maxEl</span><span class="p">:</span> <span class="n">maxEl</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="n">maxRow</span> <span class="o">=</span> <span class="n">k</span> <span class="c"># Swap maximum row with current row (column by column)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">maxRow</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="c"># Make all rows below this one 0 in current column</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="n">j</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">c</span> <span class="o">*</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># Solve equation Ax=b for an upper triangular matrix A</span> <span class="n">x</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="p">]</span><span class="o">/</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> <span class="o">-=</span> <span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">fractions</span> <span class="kn">import</span> <span class="n">Fraction</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="c"># Read input data</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">Fraction</span><span class="p">,</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">))</span> <span class="k">for</span> <span class="n">j</span><span class="p">,</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">el</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span> <span class="n">lastLine</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">Fraction</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">lastLine</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="c"># Print input</span> <span class="n">pprint</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="c"># Calculate solution</span> <span class="n">x</span> <span class="o">=</span> <span class="n">gauss</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="c"># Print result</span> <span class="n">line</span> <span class="o">=</span> <span class="s">&quot;Result:</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">line</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> </code></pre></div> <h2>JavaScript code</h2> <div class="highlight"><pre><code class="javascript"><span class="cm">/** Solve a linear system of equations given by a n&amp;times;n matrix </span> <span class="cm"> with a result vector n&amp;times;1. */</span> <span class="kd">function</span> <span class="nx">gauss</span><span class="p">(</span><span class="nx">A</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">n</span> <span class="o">=</span> <span class="nx">A</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">n</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Search for maximum in this column</span> <span class="kd">var</span> <span class="nx">maxEl</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">i</span><span class="p">]);</span> <span class="kd">var</span> <span class="nx">maxRow</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">k</span><span class="o">=</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="nx">k</span><span class="o">&lt;</span><span class="nx">n</span><span class="p">;</span> <span class="nx">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="nx">maxEl</span><span class="p">)</span> <span class="p">{</span> <span class="nx">maxEl</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">i</span><span class="p">]);</span> <span class="nx">maxRow</span> <span class="o">=</span> <span class="nx">k</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Swap maximum row with current row (column by column)</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">k</span><span class="o">=</span><span class="nx">i</span><span class="p">;</span> <span class="nx">k</span><span class="o">&lt;</span><span class="nx">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="nx">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nx">A</span><span class="p">[</span><span class="nx">maxRow</span><span class="p">][</span><span class="nx">k</span><span class="p">];</span> <span class="nx">A</span><span class="p">[</span><span class="nx">maxRow</span><span class="p">][</span><span class="nx">k</span><span class="p">]</span> <span class="o">=</span> <span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">k</span><span class="p">];</span> <span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">k</span><span class="p">]</span> <span class="o">=</span> <span class="nx">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Make all rows below this one 0 in current column</span> <span class="k">for</span> <span class="p">(</span><span class="nx">k</span><span class="o">=</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="nx">k</span><span class="o">&lt;</span><span class="nx">n</span><span class="p">;</span> <span class="nx">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="o">-</span><span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">i</span><span class="p">]</span><span class="o">/</span><span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">i</span><span class="p">];</span> <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">j</span><span class="o">=</span><span class="nx">i</span><span class="p">;</span> <span class="nx">j</span><span class="o">&lt;</span><span class="nx">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span><span class="o">==</span><span class="nx">j</span><span class="p">)</span> <span class="p">{</span> <span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">j</span><span class="p">]</span> <span class="o">+=</span> <span class="nx">c</span> <span class="o">*</span> <span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Solve equation Ax=b for an upper triangular matrix A</span> <span class="kd">var</span> <span class="nx">x</span><span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">n</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">i</span><span class="o">&gt;-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="nx">x</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">n</span><span class="p">]</span><span class="o">/</span><span class="nx">A</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">i</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">k</span><span class="o">=</span><span class="nx">i</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">k</span><span class="o">&gt;-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">k</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">n</span><span class="p">]</span> <span class="o">-=</span> <span class="nx">A</span><span class="p">[</span><span class="nx">k</span><span class="p">][</span><span class="nx">i</span><span class="p">]</span> <span class="o">*</span> <span class="nx">x</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">x</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Complexity</h2> <h3>Time complexity</h3> <p>Time complexity is in <code>$\mathcal{O}(n^3)$</code> (lines 44 - 53): <code>$ \begin{align} Operations &amp;= \sum_{i=0}^{n-1} \sum_{k=i+1}^{n-1} \sum_{j=i}^{n} 1\\ &amp;= \sum_{i=0}^{n-1} \sum_{k=i+1}^{n-1} (n-i+1) \\ &amp;= \left (\sum_{i=0}^{n-1} \sum_{k=i+1}^{n-1} (n+1) \right ) - \left (\sum_{i=0}^{n-1} \sum_{k=i+1}^{n-1} i \right )\\ &amp;= \dots \\ &amp;= \frac{1}{6} \cdot n \cdot (2 n^2+3 n-5)\\ &amp;= \frac{1}{3} \cdot n^3 + \mathcal{O}(n^2) \end{align}$</code></p> <h3>Space complexity</h3> <p>Space complexity of this implementation is in <code>$\mathcal{O}(n)$</code>, but you can easily come down to <code>$\mathcal{O}(1)$</code> when you use <code>A[n]</code> for storing <code>x</code>.</p> Generating many prime numbers http://martin-thoma.com/generating-many-prime-numbers Tue, 21 May 2013 20:50:10 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/generating-many-prime-numbers <p>Today, a fellow student claimed that it would take much time to check the first 1,000,000 numbers for primes. I claimed that it would be a matter of seconds to do so for the first 1,000,000,000 numbers.</p> <p>So, lets prove my claim.</p> <h2>Trivial approach</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt; </span><span class="c1">// cin, cout</span> <span class="cp">#include &lt;cmath&gt; </span><span class="c1">// sqrt</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="o">&gt;</span> <span class="n">primeList</span><span class="p">;</span> <span class="kt">bool</span> <span class="nf">isPrime</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">myIt</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">root</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">)</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="k">for</span><span class="p">(</span><span class="n">myIt</span><span class="o">=</span><span class="n">primeList</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">myIt</span> <span class="o">!=</span> <span class="n">primeList</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">myIt</span><span class="o">++</span><span class="p">){</span> <span class="k">if</span><span class="p">(</span><span class="n">n</span><span class="o">%</span><span class="p">(</span><span class="o">*</span><span class="n">myIt</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="o">*</span><span class="n">myIt</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">root</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">primeList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">max</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">max</span><span class="p">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">isPrime</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span> <span class="n">primeList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Execute it for 100,000,000:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 100000000 &gt; primes.txt real 0m57.274s user 0m41.855s sys 0m15.229s </code></pre></div> <p>So 41 seconds for all primes not bigger than 100,000,000. </p> <p>Now, lets test it for 1,000,000,000:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 &gt; primes.txt real 18m18.205s user 15m56.904s sys 2m12.500s </code></pre></div> <p>16 minutes ... not exactly &quot;seconds&quot;. But please keep in mind that I also wrote the result to a txt-file. This txt file is 502.0 MB big. It takes quite a lot of time to write such an amount of data from memory to disk.</p> <h2>Sieve of Eratosthenes</h2> <h3>A first try</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt; </span><span class="c1">// cin, cout</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">sieveOfEratosthenes</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="n">primesEratosthenes</span> <span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">j</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="o">&lt;=</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">sieveOfEratosthenes</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>This one takes 1 minute 5 seconds:</p> <div class="highlight"><pre><code class="bash">make<span class="p">;</span><span class="nb">time</span> ./generate-prime-list.out 1000000000 &gt; testPrimes.txt g++ -std<span class="o">=</span>c++0x -Wall -pedantic -O3 -D NDEBUG generate-prime-list.cpp -o generate-prime-list.out real 3m20.436s user 1m4.908s sys 2m11.748s </code></pre></div> <p>I&#39;m getting closer to &quot;seconds&quot;. :-)</p> <h3>ofstream, endl, \n and buffers</h3> <p>Writing 502.0 MB takes some time. It&#39;s not getting better when I pipe this through bash. So lets write it directly:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;fstream&gt; </span><span class="c1">// ofstream</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">sieveOfEratosthenes</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="n">ofstream</span> <span class="n">myfile</span><span class="p">;</span> <span class="n">myfile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="s">&quot;huge-prime-list.txt&quot;</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="n">primesEratosthenes</span> <span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span> <span class="n">myfile</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="n">myfile</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">j</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="o">&lt;=</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="n">myfile</span><span class="p">.</span><span class="n">close</span><span class="p">();</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">sieveOfEratosthenes</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 real 3m21.249s user 1m4.016s sys 2m12.332s </code></pre></div> <p>Ok, no real change :-/</p> <p>Another idea is to replace <code>endl</code> by <code>\n</code> (see <a href="http://stackoverflow.com/a/5192299/562769">explanation</a>)</p> <p>That was a good try. Now it needs only 46 seconds:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 real 0m49.539s user 0m46.619s sys 0m0.920s </code></pre></div> <p>Another reason why this might be slow could be too many system calls. So I could buffer some and write them in blocks. I could also just write blocks of unsigned long numbers instead of a string representation. This might lead to a much smaller file size which in consequence is faster to write:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;stdio.h&gt; </span><span class="c1">// fopen</span> <span class="cp">#include &lt;iostream&gt; </span><span class="c1">// atoi</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">sieveOfEratosthenes</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">pFile</span><span class="p">;</span> <span class="n">pFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">&quot;huge-prime-list.txt&quot;</span><span class="p">,</span> <span class="s">&quot;wb&quot;</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="n">primesEratosthenes</span> <span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">tmp</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">),</span><span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">i</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">),</span><span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">j</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="o">&lt;=</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="n">fclose</span><span class="p">(</span><span class="n">pFile</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">sieveOfEratosthenes</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>And execute it:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 real 0m39.700s user 0m38.546s sys 0m0.640s </code></pre></div> <p>38 seconds for all primes from 2 to 1,000,000,000. The file size is now only 203.4 MB.</p> <p>By the way, simply setting this with <code>setbuf(pFile, NULL);</code> to unbuffered resulted in 50 seconds execution time.</p> <p>You can get the list with this snippet:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;fstream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;You have to specify a file name&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">pFile</span><span class="p">;</span> <span class="n">pFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">&quot;rb&quot;</span><span class="p">);</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">;</span> <span class="kt">size_t</span> <span class="n">read</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">feof</span><span class="p">(</span><span class="n">pFile</span><span class="p">))</span> <span class="p">{</span> <span class="n">read</span> <span class="o">=</span> <span class="n">fread</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">x</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="n">read</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">feof</span><span class="p">(</span><span class="n">pFile</span><span class="p">)){</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// otherwise it duplicates the last entry</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="n">fclose</span><span class="p">(</span><span class="n">pFile</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <h3>Improve sieving</h3> <p>The following change was suggested by <em>Niklas B.</em>. Thanks!</p> <p>Take a look at the inner for loop. This one does the sieving, so it gets executed very often. In this loop, you have to calculate <code>j<em>i</code> for checking the condition of the loop and again for setting it to false. You can get rid of one of those operations. Additionally, you don&#39;t have to start sieving at <code>2</em>p</code>, but you can start at <code>p*p</code> as you already sieved out all multiples of the first, second, ..., current-1-th prime. </p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;stdio.h&gt; </span><span class="c1">// fopen</span> <span class="cp">#include &lt;iostream&gt; </span><span class="c1">// atoi</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">sieveOfEratosthenes</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">pFile</span><span class="p">;</span> <span class="n">pFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">&quot;huge-prime-list.bin&quot;</span><span class="p">,</span> <span class="s">&quot;wb&quot;</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="n">primesEratosthenes</span> <span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">tmp</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span><span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">i</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="o">*</span><span class="n">i</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;=</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">+=</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="n">primesEratosthenes</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="n">fclose</span><span class="p">(</span><span class="n">pFile</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;You have to specify n&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">sieveOfEratosthenes</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Execute:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 real 0m24.222s user 0m23.485s sys 0m0.436s </code></pre></div> <h3>primesieve</h3> <p><a href="https://code.google.com/p/primesieve/">Primesieve</a> is a free software program and C++ library that generates prime numbers and prime k-tuplets (twin primes, prime triplets, ...) <code>$&lt; 2^{64}$</code> using a highly optimized implementation of the sieve of Eratosthenes.</p> <p>According to the GUI, it finds all 50,847,534 primes below 1,000,000,000 in 0.16 seconds. But write them to a file...</p> <h2>Sieve of Atkin</h2> <p>Arthur Oliver Lonsdale Atkin (July 31, 1925 &ndash; December 28, 2008) was a British mathematician who invented this sieve. I&#39;ve implemented it according to the <a href="http://en.wikipedia.org/wiki/Sieve_of_Atkin#Pseudocode">pseudocode provided in Wikipedia</a>. A <a href="http://stackoverflow.com/a/12066272/562769">very long explanation of Atkins sieve</a> is on StackOverflow</p> <h3>My first implementation</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;stdio.h&gt; </span><span class="c1">// fopen</span> <span class="cp">#include &lt;iostream&gt; </span><span class="c1">// atoi</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;cmath&gt; </span><span class="c1">// sqrt, ceil, </span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">sieveOfAtkin</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">limit</span><span class="p">)</span> <span class="p">{</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">pFile</span><span class="p">;</span> <span class="n">pFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">&quot;huge-prime-list.bin&quot;</span><span class="p">,</span> <span class="s">&quot;wb&quot;</span><span class="p">);</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">root</span> <span class="o">=</span> <span class="n">ceil</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">limit</span><span class="p">));</span> <span class="c1">// initialize the sieve</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="n">is_prime</span><span class="p">(</span><span class="n">limit</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span> <span class="c1">// put in candidate primes: </span> <span class="c1">// integers which have an odd number of</span> <span class="c1">// representations by certain quadratic forms</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">root</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">xSquare</span> <span class="o">=</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="n">root</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span><span class="o">*</span><span class="n">xSquare</span><span class="p">)</span><span class="o">+</span><span class="p">(</span><span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&lt;=</span> <span class="n">limit</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="p">(</span><span class="n">n</span> <span class="o">%</span> <span class="mi">12</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">12</span> <span class="o">==</span> <span class="mi">5</span><span class="p">))</span> <span class="p">{</span> <span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="o">!</span><span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">];</span> <span class="p">}</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">xSquare</span><span class="p">)</span><span class="o">+</span><span class="p">(</span><span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&lt;=</span> <span class="n">limit</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">12</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span> <span class="p">{</span> <span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="o">!</span><span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">];</span> <span class="p">}</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">xSquare</span><span class="p">)</span><span class="o">-</span><span class="p">(</span><span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">y</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="n">limit</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">12</span> <span class="o">==</span> <span class="mi">11</span><span class="p">)</span> <span class="p">{</span> <span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="o">!</span><span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// eliminate composites by sieving</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="n">root</span><span class="p">;</span> <span class="n">n</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">])</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">add</span> <span class="o">=</span> <span class="n">n</span><span class="o">*</span><span class="n">n</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">k</span> <span class="o">=</span> <span class="n">add</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">limit</span><span class="p">;</span> <span class="n">k</span> <span class="o">+=</span> <span class="n">add</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// n is prime, omit multiples of its square; this is</span> <span class="c1">// sufficient because composites which managed to get</span> <span class="c1">// on the list cannot be square-free</span> <span class="n">is_prime</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Output primes</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">primTmp</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">primTmp</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="n">primTmp</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">primTmp</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="n">limit</span><span class="p">;</span> <span class="n">n</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">is_prime</span><span class="p">[</span><span class="n">n</span><span class="p">])</span> <span class="p">{</span> <span class="n">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">n</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pFile</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="n">fclose</span><span class="p">(</span><span class="n">pFile</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;You have to specify n&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">sieveOfAtkin</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Atkins sieve has a much worse performance than Sieve of Eratosthenes:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./generate-prime-list.out 1000000000 real 1m6.001s user 1m4.724s sys 0m0.604s </code></pre></div> <h3>Primegen</h3> <p><a href="http://cr.yp.to/primegen.html">Primegen</a> is an implementation by <a href="http://en.wikipedia.org/wiki/Daniel_J._Bernstein">Daniel J. Bernstein</a>. It&#39;s a little bit cluttered with 80 files and 3854 LOC in total.</p> <p>When I have some time, I&#39;ll update this article and create a new version of my sieve with ideas from Primegen.</p> <p>Primegen is fast:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time</span> ./primes &gt; primes.txt real 0m11.677s user 0m10.649s sys 0m0.708s </code></pre></div> <p>About 11 seconds for writing all primes between 2 and 1,000,000,000 to a txt file.</p> <h2>See also</h2> <p>You might want to try the following Project Euler problem sets: <ul> <li>Project Euler <ul> <li><a href="http://projecteuler.net/problem=3">Problem 3</a>: What is the largest prime factor of the number 600851475143 ?</li> <li><a href="http://projecteuler.net/problem=7">Problem 7</a>: What is the 10 001st prime number?</li> <li><a href="http://projecteuler.net/problem=60">Problem 60</a></li> </ul> </li> <li>SPOJ <ul> <li><a href="http://www.spoj.com/problems/PRIME1/">PRIME1</a></li> <li><a href="http://www.spoj.com/problems/PRIME2/">PRIME2</a></li> <li><a href="http://www.spoj.com/problems/KPRIMES2/">KPRIMES2</a></li> </ul> </li> <li><a href="http://sweet.ua.pt/tos/software/prime_sieve.html">Segmented sieve of Eratosthenes</a></li> <li><a href="http://www.troubleshooters.com/codecorn/primenumbers/primenumbers.htm">Fun with prime numbers</a>: This looks almost like my article. It might be interesting, because the author thought about finding primes above <code>$10^9$</code> which I didn&#39;t.</li> </ul></p> <h2>Finally</h2> <p>The last script that took 23 seconds for calculating and writing all primes in 2 to 1,000,000,000 seems to be the best one. Do you know anything else that could get improved? Please provide a working example (e.g. as a <a href="https://gist.github.com/">gist</a>)</p> Solving equations of upper triangular matrices http://martin-thoma.com/solving-equations-of-upper-triangular-matrices Mon, 20 May 2013 08:41:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/solving-equations-of-upper-triangular-matrices <p>Suppose you have an equation like <code>$R \cdot x = b$</code> with <code>$R \in \mathbb{R}^{n \times n}$</code> and <code>$x,b \in \mathbb{R}^n$</code>. <code>$b$</code> and <code>$R$</code> are given and you want to solve for <code>$x$</code>.</p> <h2>Example</h2> <p>With <code>$n=5$</code>, the problem could look like this:</p> <p><code>$\begin{pmatrix} 2 &amp; 7 &amp; 1 &amp; 8 &amp; 2\\ 0 &amp; 8 &amp; 1 &amp; 8 &amp; 2\\ 0 &amp; 0 &amp; 8 &amp; 4 &amp; 5\\ 0 &amp; 0 &amp; 0 &amp; 9 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 4 \end{pmatrix} \cdot \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{pmatrix} = \begin{pmatrix} 3 \\ 1 \\ 4 \\ 1 \\ 5 \end{pmatrix}$</code></p> <p>This is only a shorthand for: <code>$ \begin{align} 2 \cdot x_1 + 7 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + 2 \cdot x_5 &amp;= 3\\ 8 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + 2 \cdot x_5 &amp;= 1\\ 8 \cdot x_3 + 4 \cdot x_4 + 5 \cdot x_5 &amp;= 4\\ 9 \cdot x_4 + 0 \cdot x_5 &amp;= 1\\ 4 \cdot x_5 &amp;= 5 \end{align} $</code></p> <h3>First step: Solve for `$x_5$`</h3> <p>First you see that <code>$x_5 = \frac{5}{4}$</code>. So you divide <code>$b$</code> by the current row.</p> <div class="important">Don't divide through 0. When you would have to divide by 0 and b is 0, this system has an infinite amount of solutions. When you would have to divide by 0 and b is not 0, then this system has no solution.</div> <p>Now you replace every occurrence of <code>$x_5$</code> in the system of equations above:</p> <p><code>$ \begin{align} 2 \cdot x_1 + 7 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + 2 \cdot \frac{5}{4} &amp;= 3\\ 8 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + 2 \cdot \frac{5}{4} &amp;= 1\\ 8 \cdot x_3 + 4 \cdot x_4 + 5 \cdot \frac{5}{4} &amp;= 4\\ 9 \cdot x_4 + 0 \cdot \frac{5}{4} &amp;= 1\\ 4 \cdot \frac{5}{4} &amp;= 5 \end{align} $</code></p> <p>Now you make the multiplications and remove the first trivial line.</p> <p><code>$ \begin{align} 2 \cdot x_1 + 7 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + \frac{5}{2} &amp;= 3\\ 8 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 + \frac{5}{2} &amp;= 1\\ 8 \cdot x_3 + 4 \cdot x_4 + \frac{25}{4} &amp;= 4\\ 9 \cdot x_4 + 0 &amp;= 1\\ \end{align} $</code></p> <h3>Second step: update</h3> <p>Get the constant factors to the right side of the equations: <code>$ \begin{align} 2 \cdot x_1 + 7 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 &amp;= \frac{1}{2} \\ 8 \cdot x_2 + 1 \cdot x_3 + 8 \cdot x_4 &amp;= -\frac{3}{2} \\ 8 \cdot x_3 + 4 \cdot x_4 &amp;= -\frac{9}{4}\\ 9 \cdot x_4 &amp;= 1\\ \end{align} $</code></p> <p>You&#39;re now in the same situation as in the first step. Next you will solve for <code>$x_4$</code>, then for <code>$x_3, x_2$</code> and finally for <code>$x_1$</code>.</p> <p>This is called &quot;back substitution&quot;.</p> <p><a href="http://www.wolframalpha.com/input/?i=%7B%7B2%2C7%2C1%2C8%2C2%7D%2C%7B0%2C8%2C1%2C8%2C2%7D%2C%7B0%2C0%2C8%2C4%2C5%7D%2C%7B0%2C0%2C0%2C9%2C0%7D%2C%7B0%2C0%2C0%2C0%2C4%7D%7D%5E-1*%7B%7B3%7D%2C%7B1%7D%2C%7B4%7D%2C%7B1%7D%2C%7B5%7D%7D">According to Wolfram|Alpha</a>, the solution is:</p> <p><code>$x = \frac{1}{4608} \cdot \begin{pmatrix}4017\\-1182\\-1552\\512\\5760\end{pmatrix} = \begin{pmatrix}\frac{1339}{1536} \\ -\frac{197}{768} \\ -\frac{97}{288} \\ \frac{1}{9} \\ \frac{5}{4}\end{pmatrix}$</code></p> <h2>Python straightforward algorithm</h2> <p>I will use <a href="http://docs.python.org/2/library/fractions.html">fractions</a> for operations as I don&#39;t want to lose precision while dividing.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solveUpperTriangularMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="c"># Convert R and b to Fraction</span> <span class="kn">from</span> <span class="nn">fractions</span> <span class="kn">import</span> <span class="n">Fraction</span> <span class="n">fR</span><span class="p">,</span> <span class="n">fb</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">R</span><span class="p">):</span> <span class="n">fLine</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">y</span><span class="p">,</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="n">fLine</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Fraction</span><span class="p">(</span><span class="n">el</span><span class="p">))</span> <span class="n">fR</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fLine</span><span class="p">)</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span> <span class="n">fb</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Fraction</span><span class="p">(</span><span class="n">el</span><span class="p">))</span> <span class="c"># The solution will be here</span> <span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">Fraction</span><span class="p">(</span><span class="mi">0</span><span class="p">)]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">fR</span><span class="p">[</span><span class="n">step</span><span class="p">][</span><span class="n">step</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">fb</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="s">&quot;No solution&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="s">&quot;Infinity solutions&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">=</span> <span class="n">fb</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">/</span> <span class="n">fR</span><span class="p">[</span><span class="n">step</span><span class="p">][</span><span class="n">step</span><span class="p">]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">fb</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">-=</span> <span class="n">fR</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">step</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="n">x</span> <span class="o">=</span> <span class="n">solveUpperTriangularMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="c"># Convert x to float</span> <span class="n">x</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> </code></pre></div> <h2>A better algorithm</h2> <p>Just like for <a href="../solving-equations-of-unipotent-lower-triangular-matrices/" title="Solving equations of unipotent lower triangular matrices">unipotent lower triangular matrices</a>, we can operate directly on the given input:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solveUpperTriangularMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="c"># Convert R and b to Fraction</span> <span class="kn">from</span> <span class="nn">fractions</span> <span class="kn">import</span> <span class="n">Fraction</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">R</span><span class="p">):</span> <span class="k">for</span> <span class="n">y</span><span class="p">,</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="n">R</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">Fraction</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">b</span><span class="p">):</span> <span class="n">b</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">Fraction</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="c"># The solution will be here</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">R</span><span class="p">[</span><span class="n">step</span><span class="p">][</span><span class="n">step</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="s">&quot;No solution&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="s">&quot;Infinity solutions&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">/</span> <span class="n">R</span><span class="p">[</span><span class="n">step</span><span class="p">][</span><span class="n">step</span><span class="p">]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="n">b</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">-=</span> <span class="n">R</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">step</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="n">solveUpperTriangularMatrix</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> </code></pre></div> <h2>Conversion to Fraction</h2> <p>You could think that the conversion to fraction is not necessary. But if you simply remove line 5 to 16, you will get:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>1, 0, -1, 0, 1<span class="o">]</span> </code></pre></div> <p>because of integer arithmetic. When you convert the input to float before passing it to <code>solveUpperTriangularMatrix</code>, you will get </p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>0.8717447916666666, -0.25651041666666663, -0.3368055555555556, 0.1111111111111111, 1.25<span class="o">]</span> </code></pre></div> <p>which is almost the same as when we calculated with Fraction and converted to float afterwards:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>0.8717447916666666, -0.2565104166666667, -0.3368055555555556, 0.1111111111111111, 1.25<span class="o">]</span> </code></pre></div> <p>So: Using Fractions needs some computing time, but you will get better results.</p> <h2>Time complexity</h2> <p>I&#39;ll analyze the second algorithm.</p> <p>The conversion of our input data is obviously in <code>$\mathcal{O}(n^2)$</code>. Let&#39;s only analyse the part after the conversion.</p> <p>Assume that there is exactly one solution and that line 15-21 take <code>$c_1$</code> operations and line 24 takes <code>$c_2$</code> operations.</p> <p>Then we would have a total of </p> <p><code>$\begin{align} \text{Operations} &amp;= \sum_{i=1}^n \left ( c_1 + \sum_{j=1}^{i-1} c_2 \right )\\ &amp;= \sum_{i=1}^n c_1 + \sum_{i=1}^n \sum_{j=1}^{i-1} c_2\\ &amp;= n \cdot c_1 + c_2 \cdot \left (\sum_{i=1}^n \sum_{j=1}^{i-1} 1 \right )\\ &amp;= n \cdot c_1 + c_2 \cdot \left (\sum_{i=1}^n (i-1) \right )\\ &amp;= n \cdot c_1 + c_2 \cdot \left ((\sum_{i=1}^n i) - (\sum_{i=1}^n 1) \right )\\ &amp;= n \cdot c_1 + c_2 \cdot \left (\frac{n^2+n}{2} - n \right )\\ &amp;= n \cdot c_1 + (n^2-n) \cdot \frac{c_2}{2}\\ \end{align}$</code></p> <p>So the algorithms time complexity is in <code>$\Theta(n^2) \subsetneq \mathcal{O}(n^2)$</code>.</p> <h2>Space complexity</h2> <p>Please note that I take advantage of Pythons dynamic typing system. I think it&#39;s difficult to see space complexity in python programs. But when you make the same in C++, you will see that you will need space in <code>$\mathcal{O}(n)$</code> when you do the conversion. Without the conversion, you&#39;re in <code>$\mathcal{O}(1)$</code>.</p> <p>I guess you might want to leave this choice to the user of your functions. When he wants better results, he should give the input as Fraction. When he wants to get results rather faster, he should give the input as float.</p> <h2>Notes</h2> <p>In this algorithm, we don&#39;t need anything below the diagonal.</p> Solving equations of lower unitriangular matrices http://martin-thoma.com/solving-equations-of-unipotent-lower-triangular-matrices Sun, 19 May 2013 20:15:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/solving-equations-of-unipotent-lower-triangular-matrices <p>Suppose you have an equation like <code>$L \cdot x = b$</code> with <code>$L \in \mathbb{R}^{n \times n}$</code> and <code>$x,b \in \mathbb{R}^n$</code>. <code>$b$</code> and <code>$L$</code> are given and you want to solve for <code>$x$</code>.</p> <h2>Example</h2> <p>With <code>$n=5$</code>, the problem could look like this:</p> <p><code>$\begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0\\ 2 &amp; 1 &amp; 0 &amp; 0 &amp; 0\\ 7 &amp; 1 &amp; 1 &amp; 0 &amp; 0\\ 8 &amp; 2 &amp; 8 &amp; 1 &amp; 0\\ 1 &amp; 8 &amp; 2 &amp; 8 &amp; 1 \end{pmatrix} \cdot \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{pmatrix} = \begin{pmatrix} 3 \\ 1 \\ 4 \\ 1 \\ 5 \end{pmatrix}$</code></p> <p>This is only a shorthand for: <code>$ \begin{align} &amp;1 \cdot x_1 &amp;= 3 \\ &amp;2 \cdot x_1 + 1 \cdot x_2 &amp;= 1\\ &amp;7 \cdot x_1 + 1 \cdot x_2 + 1 \cdot x_3 &amp;= 4\\ &amp;8 \cdot x_1 + 2 \cdot x_2 + 8 \cdot x_3 + 1 \cdot x_4 &amp;= 1\\ &amp;1 \cdot x_1 + 8 \cdot x_2 + 2 \cdot x_3 + 8 \cdot x_4 + 1 \cdot x_5 &amp;= 5 \end{align} $</code></p> <p>This is easy to solve, isn&#39;t it? <h3>First step: Solve for <code>$x_1$</code></h3> First you see that <code>$x_1 = 3$</code>. Now you replace every occurence of <code>$x_1$</code> in the system of equations above:</p> <p><code>$ \begin{align} &amp;1 \cdot 3 &amp;= 3 \\ &amp;2 \cdot 3 + 1 \cdot x_2 &amp;= 1\\ &amp;7 \cdot 3 + 1 \cdot x_2 + 1 \cdot x_3 &amp;= 4\\ &amp;8 \cdot 3 + 2 \cdot x_2 + 8 \cdot x_3 + 1 \cdot x_4 &amp;= 1\\ &amp;1 \cdot 3 + 8 \cdot x_2 + 2 \cdot x_3 + 8 \cdot x_4 + 1 \cdot x_5 &amp;= 5 \end{align}$</code></p> <p>Now you make the multiplications and remove the first trivial line.</p> <p><code>$ \begin{align} &amp;6 + 1 \cdot x_2 &amp;= 1\\ &amp;21 + 1 \cdot x_2 + 1 \cdot x_3 &amp;= 4\\ &amp;24 + 2 \cdot x_2 + 8 \cdot x_3 + 1 \cdot x_4 &amp;= 1\\ &amp;3 + 8 \cdot x_2 + 2 \cdot x_3 + 8 \cdot x_4 + 1 \cdot x_5 &amp;= 5 \end{align} $</code></p> <h3>Second step: update</h3> <p>Get the constant factors to the right side of the equations: <code>$ \begin{align} &amp;1 \cdot x_2 &amp;= 1-6=-5\\ &amp;1 \cdot x_2 + 1 \cdot x_3 &amp;= 4-21=-17\\ &amp;2 \cdot x_2 + 8 \cdot x_3 + 1 \cdot x_4 &amp;= 1-24=-23\\ &amp;8 \cdot x_2 + 2 \cdot x_3 + 8 \cdot x_4 + 1 \cdot x_5 &amp;= 5-3=2 \end{align} $</code></p> <p>You can now easily see that you&#39;re in the same situation as in the first step! Next you will solve for <code>$x_2$</code>, then for <code>$x_3, x_4$</code> and finally for <code>$x_5$</code>.</p> <p>This is the reason why solving such a system of equations is sometimes called &quot;forward substitution&quot;.</p> <h2>Python straightforward algorithm</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="n">x</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="n">b</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">-</span> <span class="n">L</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">step</span><span class="p">]</span><span class="o">*</span><span class="n">x</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="k">print</span><span class="p">(</span><span class="n">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span> </code></pre></div> <p>Pretty easy, isn&#39;t it? But can we even do better?</p> <h2>Even better algorithm</h2> <p>Yes, we can!</p> <p>Take a look at what&#39;s happening when row = 0 in line 9. We make a step that is not necessary. Also, we can take the space of b to store x!</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="n">b</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">-=</span> <span class="n">L</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">step</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="n">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> </code></pre></div> <p>Now it looks super clean, doesn&#39;t it :-)</p> <p>Keep in mind that you have to store b if you need the values after you&#39;ve applied this algorithm. This is the reason why there here. This algorithm &quot;returns&quot; its value by manipulating b.</p> <h2>Time complexity</h2> <p>I&#39;ll analyze the second algorithm.</p> <p>Let&#39;s assume that line 7 takes <code>$c$</code> operations and <code>$n$</code> is the size of <code>$L \in \mathbb{R}^{n \times n}$</code>.</p> <p>Then we would have a total of </p> <p><code>$\begin{align} \text{Operations} &amp;= \sum_{i=1}^n \left ( \sum_{j=i+1}^n c \right )\\ &amp;= c \cdot \sum_{i=1}^n \left ( \sum_{j=i+1}^n 1 \right )\\ &amp;= c \cdot \sum_{i=1}^n (n - i)\\ &amp;= c \cdot \left ( \sum_{i=1}^n n - \sum_{i=1}^n i \right )\\ &amp;= c \cdot \left ( n^2 - \frac{n^2+n}{2} \right )\\ &amp;= \frac{c}{2} (n^2 - n) \end{align}$</code></p> <p>So the algorithms time complexity is in <code>$\Theta(n^2) \subsetneq \mathcal{O}(n^2)$</code>.</p> <h2>Space complexity</h2> <p>Well, thats simple: <code>$\mathcal{O}(1)$</code>!</p> <p>I do ignore the size of the input. So <code>$\mathcal{O}(1)$</code> means: For variable sized input data I do need a constant amount of additional space.</p> <h2>More improvements</h2> <p>In the last algorithm I&#39;ve presented you can see that we actually don&#39;t check the values on or above of the diagonal. This means, the following two function calls do give the same b:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span> <span class="n">b</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">-=</span> <span class="n">L</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">step</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="k">return</span> <span class="n">L</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="n">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">6</span><span class="p">],</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span> <span class="n">solveLowerUnitriangularMatrix</span><span class="p">(</span><span class="n">L</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> </code></pre></div> <p>So, theoretically, we could store some other information on and above of the diagonal. We also don&#39;t change L. Keep this in mind, this might be important in later articles.</p> k-nearest-neighbor clustering - an interactive example http://martin-thoma.com/k-nearest-neighbor-clustering-interactive-example Sun, 19 May 2013 13:23:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/k-nearest-neighbor-clustering-interactive-example <iframe src="../html5/clustering/clustering.htm" width="98%" height="700px"></iframe> <p>When the circle has exactly the same number of blue / green dots in it, it will be green.</p> <p>When you move the mouse over the box, everything will be calculated and drawn again. This leads to flickering with k-means, as k-means includes a random choice of cluster centers.</p> <h2>Changelog</h2> <table> <tr> <th>Version</th> <th>Change</th> </tr> <tr> <td><span class="hint" title="974b52110126bfd7169622c7041506f56beae1cf">2.2</span></td> <td>Cluster centers have the same color as the clustered points; when one cluster has no points (and there are at least as many points as clusters) everything gets recalculated</td> </tr> <tr> <td><span class="hint" title="1c37b0a860a419668e54c3c6c6189148485d3ea5">2.1</span></td> <td>users can now specify an arbitrary number of classes; ctrl-key change of class was removed; added hints to configuration options</td> </tr> <tr> <td><span class="hint" title="4ed5997089...">2.0</span></td> <td>k-means implemented</td> </tr> <tr> <td>1.0</td> <td>k-nearest neighbor implemented</td> </tr> </table> <p>Code is <a href="https://github.com/MartinThoma/algorithms/tree/master/k-nearest-neighbor">on GitHub</a>. You may use it for free, but you should add a link to this article.</p> <h2>See also</h2> <div style="width: 401px" class="wp-caption aligncenter"><a href="../images/2013/05/k-nearest-neighbor-interesting-setting.png"><img src="../images/2013/05/k-nearest-neighbor-interesting-setting.png" alt="" width="401" height="401" class="size-full wp-image-66811"/></a><p class="wp-caption-text"></p></div> <div style="width: 800px" class="wp-caption aligncenter"><a href="../images/2013/05/k-means-good-vs-bad.png"><img src="../images/2013/05/k-means-good-vs-bad.png" alt="" width="800" height="379" class="size-full wp-image-67701"/></a><p class="wp-caption-text"></p></div> <ul> <li><a href="http://en.wikipedia.org/wiki/Voronoi_diagram">Voronoi diagram</a></li> <li><a href="http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm">K-nearset neighbor</a></li> <li><a href="http://en.wikipedia.org/wiki/K-means_clustering">k-means clustering</a></li> <li>Udacity: Introduction to A.I: <a href="https://www.youtube.com/watch?v=zaKjh2N8jN4">k-means</a></li> </ul> The Collatz sequence http://martin-thoma.com/the-collatz-sequence Thu, 16 May 2013 21:58:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/the-collatz-sequence <p>The goal of this post is to show you some tools that allow you to visualize data. And I also want to analyze some basic characteristics of the Collatz sequence.</p> <p>The Collatz sequences <code>$(c^n_i)$</code> of a number <code>$n \in \mathbb{N}_{&gt; 0}$</code> is defined like this:</p> <p><code>$f:\mathbb{N}_{&gt;0} \rightarrow \mathbb{N}_{&gt; 0}\;\;\;\;f(n) := \begin{cases} \frac{n}{2} &amp; \text{if } n \text{ is even}\\ 3 \cdot n + 1 &amp; \text{if } n \text{ is odd} \end{cases}$</code></p> <p>So the sequence <code>$(c^n_{i})$</code> is defined as:</p> <p><code>$c^n_{i} := \begin{cases} n &amp; \text{if } i = 0\\ f(c^n_i) &amp; \text{otherwise} \end{cases}$</code></p> <p>You can define a directed graph <code>$G=(V, E)$</code> like this:</p> <p><code>$V = \mathbb{N}_{&gt;0}, \;\;\; E = \{(n, f(n)) | n \in V\}$</code></p> <p>I will call this the <em>Collatz graph</em>.</p> <h2>Collatz conjecture</h2> <div class="important"> `$\forall_{n \in \mathbb{N}_{>0}} \exists_{i \in \mathbb{N}_{>0}}: c^n_i = 1$` </div> <p>The Collatz conjecture was not (dis)proved by now. This is astonishing, as it was proposed in 1937 and I think it is very easy to understand.</p> <p>We also don&#39;t know if the Collatz graph is connected. When it is not connected, it could be that one sequence <code>$(c^n_i)$</code> goes to infinity or that there is another circle (<code>$4,2,1,4$</code> is a circle in the Collatz graph).</p> <h2>Small `$n$`</h2> <p>When you go through all possible Collatz sequences with <code>$n \in 1, \dots, 15$</code>, this is what you get:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/collatz-graph.png"><img src="../images/2013/05/collatz-graph.png" alt="" width="512" height="410" class="size-full wp-image-66201"/></a><p class="wp-caption-text"></p></div> <p>This image was created with the following Python script:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="c"># Based on: http://en.wikipedia.org/wiki/File:Collatz-graph-all-30-no27.svg</span> <span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="o">/</span> <span class="mi">2</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">3</span><span class="o">*</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">writeDotfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">limit</span><span class="p">,</span> <span class="n">explored</span><span class="p">):</span> <span class="n">dotfile</span> <span class="o">=</span> <span class="nb">file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;digraph {</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;node[style=filled,color=&quot;.7 .3 1.0&quot;];</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;1</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;node[style=filled,color=&quot;.95 .1 1&quot;];</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="c">#dotfile.write(&#39;size=&quot;15,8&quot;;\n&#39;)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">limit</span><span class="p">):</span> <span class="k">while</span> <span class="n">n</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">explored</span><span class="p">:</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39; -&gt; &#39;</span><span class="p">)</span> <span class="n">explored</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">n</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="n">dotfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;}</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">createPng</span><span class="p">(</span><span class="n">dotfile</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">program</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">os</span> <span class="n">command</span> <span class="o">=</span> <span class="n">program</span> <span class="o">+</span> <span class="s">&quot; -Tsvg &quot;</span> <span class="o">+</span> <span class="n">dotfile</span> <span class="o">+</span> <span class="s">&quot; -o &quot;</span> <span class="o">+</span> <span class="n">base</span> <span class="o">+</span> <span class="s">&quot;.svg&quot;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Execute command: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;inkscape &quot;</span><span class="o">+</span><span class="n">base</span><span class="o">+</span><span class="s">&quot;.svg&quot;</span><span class="o">+</span><span class="s">&quot; -w 512 --export-png=&quot;</span><span class="o">+</span><span class="n">base</span><span class="o">+</span><span class="s">&quot;.png&quot;</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Execute command: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">argparse</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span> <span class="n">description</span><span class="o">=</span><span class="s">&quot;Graph for small Collatz sequences&quot;</span> <span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-f&quot;</span><span class="p">,</span> <span class="s">&quot;--file&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;collatz-graph.gv&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;write dot-FILE&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-p&quot;</span><span class="p">,</span> <span class="s">&quot;--program&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;program&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;dot, neato, twopi, circo, fdp, sfdp, osage&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;PROGRAM&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;dot&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-n&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;limit&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;limit&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="n">writeDotfile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">limit</span><span class="p">,</span> <span class="nb">set</span><span class="p">([</span><span class="mi">1</span><span class="p">]))</span> <span class="kn">import</span> <span class="nn">os</span> <span class="n">createPng</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span> <span class="n">args</span><span class="o">.</span><span class="n">program</span><span class="p">)</span> </code></pre></div> <p>called like this:</p> <div class="highlight"><pre><code class="bash">python small-numbers.py -n 15 -p fdp </code></pre></div> <h2>`$n=27$`</h2> <p><code>$n=27$</code> is an enourmously long sequence:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/collatz-27.png"><img src="../images/2013/05/collatz-27.png" alt="" width="512" height="227" class="size-full wp-image-66351"/></a><p class="wp-caption-text"></p></div> <p>It was created with pgfplots:</p> <div class="highlight"><pre><code class="text">\documentclass[varwidth=true, border=2pt]{standalone} \usepackage[margin=2.5cm]{geometry} %layout \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis}[ axis x line=middle, axis y line=middle, enlarge y limits=true, scaled y ticks = false, width=15cm, height=8cm, % size of the image grid = major, grid style={dashed, gray!30}, ylabel=`$c^{27}_i$`, xlabel=`$i$`, legend style={at={(0.1,-0.1)}, anchor=north} ] \addplot[sharp plot, mark=x, blue] table [x=steps, y=n, col sep=comma] {../collatz27.csv}; \end{axis} \end{tikzpicture} \end{document} </code></pre></div> <h2>How long are Collatz sequences?</h2> <p>I&#39;ve been interested in the question how long Collatz sequences are. Of course, they will be longer when <code>$n$</code> is bigger. But how does the choice of <code>$n$</code> influence the number of steps it takes until you reach <code>$c^n_i = 1$</code>?</p> <p>I&#39;ve tested all Collatz sequences with <code>$n \leq 10,000,000$</code>. This is the result:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/collatz-sequence-steps.png"><img src="../images/2013/05/collatz-sequence-steps.png" alt="" width="512" height="512" class="size-full wp-image-66231"/></a><p class="wp-caption-text"></p></div> <p>For every hexagon, you check how many datapoints <code>$(n,steps)$</code> you have there. This leads to the count. As you can see, step numbers from 50-120 are very common, the rest is very uncommon. The number of steps increases very slow.</p> <p>The data was created as a 116.9 MB csv file with this C++ code:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;map&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;climits&gt; </span><span class="c1">// get maximum value of unsigned long long</span> <span class="cp">#include &lt;cstdlib&gt; </span><span class="c1">// exit</span> <span class="cp">#define SURPRESS_OUTPUT true</span> <span class="cp">#define SHOW_DICT_CREATION false</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">element</span> <span class="p">{</span> <span class="cm">/** What is the next collatz number? */</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">next</span><span class="p">;</span> <span class="cm">/** How many steps does it take until you reach 1? */</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">steps</span><span class="p">;</span> <span class="p">};</span> <span class="n">map</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">,</span> <span class="k">struct</span> <span class="n">element</span><span class="o">&gt;</span> <span class="n">collatz</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">CRITICAL_VALUE</span> <span class="o">=</span> <span class="p">(</span><span class="n">ULLONG_MAX</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">maxAddFromOneEntry</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">maxEntry</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">maxStepsToOne</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">saveULong</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="cm">/** n &gt;= 1 */</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="nf">nextCollatz</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span><span class="o">%</span><span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;=</span> <span class="n">CRITICAL_VALUE</span><span class="p">)</span> <span class="p">{</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Critical value is: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">CRITICAL_VALUE</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;n is: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">n</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;saveULong is: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">saveULong</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">insertCollatz</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span><span class="p">){</span> <span class="k">if</span> <span class="p">(</span><span class="n">collatz</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">==</span> <span class="n">collatz</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">SHOW_DICT_CREATION</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">SURPRESS_OUTPUT</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; is not in collatz:&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// i is not in collatz</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span> <span class="n">steps</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">current</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">next</span> <span class="o">=</span> <span class="n">nextCollatz</span><span class="p">(</span><span class="n">current</span><span class="p">);</span> <span class="k">while</span><span class="p">(</span><span class="n">collatz</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">current</span><span class="p">)</span> <span class="o">==</span> <span class="n">collatz</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span> <span class="n">steps</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">current</span><span class="p">);</span> <span class="n">current</span> <span class="o">=</span> <span class="n">next</span><span class="p">;</span> <span class="n">next</span> <span class="o">=</span> <span class="n">nextCollatz</span><span class="p">(</span><span class="n">current</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">steps</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">maxAddFromOneEntry</span><span class="p">)</span> <span class="p">{</span> <span class="n">maxAddFromOneEntry</span> <span class="o">=</span> <span class="n">steps</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="p">}</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;::</span><span class="n">reverse_iterator</span> <span class="n">it</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="n">it</span><span class="o">=</span><span class="n">steps</span><span class="p">.</span><span class="n">rbegin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">steps</span><span class="p">.</span><span class="n">rend</span><span class="p">();</span> <span class="n">it</span><span class="o">++</span><span class="p">){</span> <span class="k">struct</span> <span class="n">element</span> <span class="n">el</span><span class="p">;</span> <span class="n">el</span><span class="p">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">current</span><span class="p">;</span> <span class="n">el</span><span class="p">.</span><span class="n">steps</span> <span class="o">=</span> <span class="n">collatz</span><span class="p">[</span><span class="n">current</span><span class="p">].</span><span class="n">steps</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="n">collatz</span><span class="p">[</span><span class="o">*</span><span class="n">it</span><span class="p">]</span> <span class="o">=</span> <span class="n">el</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">el</span><span class="p">.</span><span class="n">steps</span> <span class="o">&gt;</span> <span class="n">maxStepsToOne</span><span class="p">)</span> <span class="p">{</span> <span class="n">maxStepsToOne</span> <span class="o">=</span> <span class="n">el</span><span class="p">.</span><span class="n">steps</span><span class="p">;</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span> <span class="o">&gt;</span> <span class="n">maxEntry</span><span class="p">)</span> <span class="p">{</span> <span class="n">maxEntry</span> <span class="o">=</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span> <span class="p">}</span> <span class="n">current</span> <span class="o">=</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">SHOW_DICT_CREATION</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">SURPRESS_OUTPUT</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">inserted &quot;</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">it</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;-&gt;&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">el</span><span class="p">.</span><span class="n">next</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">SHOW_DICT_CREATION</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">SURPRESS_OUTPUT</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; was already in collatz.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">printCollatz</span><span class="p">()</span> <span class="p">{</span> <span class="k">for</span><span class="p">(</span><span class="n">map</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">,</span> <span class="k">struct</span> <span class="n">element</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span><span class="o">=</span><span class="n">collatz</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span><span class="o">!=</span><span class="n">collatz</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">next</span> <span class="o">=</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span><span class="p">).</span><span class="n">first</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="n">next</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">next</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;-&gt;&quot;</span><span class="p">;</span> <span class="n">next</span> <span class="o">=</span> <span class="n">collatz</span><span class="p">[</span><span class="n">next</span><span class="p">].</span><span class="n">next</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">printSteps</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">max</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;n,steps&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;=</span><span class="n">max</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;,&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">collatz</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">steps</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">struct</span> <span class="n">element</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span><span class="p">.</span><span class="n">next</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="n">e</span><span class="p">.</span><span class="n">steps</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">collatz</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="p">;</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">maxCollatz</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">maxCollatz</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">insertCollatz</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="n">saveULong</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">1000000</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;maxAddFromOneEntry: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">maxAddFromOneEntry</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;maxStepsToOne: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">maxStepsToOne</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;maxEntry: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">maxEntry</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;entries: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">collatz</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">//printCollatz();</span> <span class="n">printSteps</span><span class="p">(</span><span class="n">maxCollatz</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Then I&#39;ve processed it with R:</p> <div class="highlight"><pre><code class="bash">R -f analyze.R </code></pre></div> <p>analyze.R:</p> <div class="highlight"><pre><code class="text">library(ggplot2) memory.limit(4000) mydata = read.csv(&quot;/home/moose/Downloads/algorithms/collatz/steps.csv&quot;) # Prepare data p&lt;-ggplot(mydata, aes ( x=n,y=steps )) p&lt;-p + geom_hex(bins=30) p&lt;-p + opts(panel.background = theme_rect(fill=&#39;white&#39;, colour=&#39;white&#39;)) # This will save the result in a pdf file called Rplots.pdf p </code></pre></div> <p>And finally, I&#39;ve converted it to png:</p> <div class="highlight"><pre><code class="bash">inkscape Rplots.pdf -w 512 --export-png<span class="o">=</span>collatz-sequence-steps.png </code></pre></div> <p>I&#39;ve explained this a bit more detailed on <a href="http://tex.stackexchange.com/a/114577/5645">StackExchange</a>.</p> <h2>Maximum in sequence</h2> <p>In the following plot you can see <code>$n \in 1, \dots, 10,000,000$</code> on the <code>$x$</code>-axis and the maximum <code>$y = \max(\{a^n_i | i \in \mathbb{N}_{&gt; 0}\})$</code>:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/maxInSequence.png"><img src="../images/2013/05/maxInSequence.png" alt="" width="512" height="512" class="size-full wp-image-66391"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="text">library(ggplot2) mydata = read.csv(&quot;../collatz-maxNumber.csv&quot;) # Prepare data p&lt;-ggplot(mydata, aes(x=n, y=maximum)) + scale_y_log10() p&lt;-p + geom_hex(bins=50) p&lt;-p + opts(panel.background = theme_rect(fill=&#39;white&#39;, colour=&#39;white&#39;)) # This will save the result in a pdf file called Rplots.pdf p </code></pre></div> <h2>Execution times</h2> <p>Generating all Collatz sequences up to 10,000,000 items took about 50 seconds. But R needed about 10 minutes to generate images from that.</p> <p>Inkscape didn&#39;t like the heavy plot:</p> <div class="highlight"><pre><code class="bash">moose@pc07<span class="nv">$ </span>inkscape Rplots.pdf -w 512 --export-png<span class="o">=</span>maxInSequence.png <span class="o">(</span>inkscape:26733<span class="o">)</span>: GLib-ERROR **: /build/buildd/glib2.0-2.34.1/./glib/gmem.c:165: failed to allocate 3440640 bytes ^CTrace/breakpoint <span class="nb">trap</span> <span class="o">(</span>core dumped<span class="o">)</span> </code></pre></div> <h2>Maximum in sequence and steps</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/collatz-sequence-and-steps-for-n.png"><img src="../images/2013/05/collatz-sequence-and-steps-for-n.png" alt="" width="512" height="512" class="size-full wp-image-66481"/></a><p class="wp-caption-text"></p></div> <h2>Read more</h2> <ul> <li><a href="https://github.com/MartinThoma/algorithms/tree/master/collatz">All sources</a> of this article are on GitHub</li> <li><a href="http://www.graphviz.org/Documentation/dotguide.pdf">Dot guide</a>, <a href="http://www.graphviz.org/doc/info/shapes.html">Node shapes</a></li> <li><a href="http://wiki.ubuntuusers.de/R">R on UbuntuUsers</a> (German)</li> <li><a href="http://projecteuler.net/problem=14">Project Euler 14</a></li> </ul> Maps in C++ http://martin-thoma.com/maps-in-cpp Thu, 16 May 2013 06:52:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/maps-in-cpp <p>Maps are one of the most useful datastructures in C++ and there is no excuse for not knowing it.</p> <p>Here is a basic example that shows how you can use it:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt; </span><span class="c1">// cout</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;map&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span> <span class="n">string</span><span class="o">&gt;</span> <span class="n">phonebook</span><span class="p">;</span> <span class="c1">// Put some stuff in it</span> <span class="n">phonebook</span><span class="p">[</span><span class="s">&quot;Martin&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;(0123) 45 678&quot;</span><span class="p">;</span> <span class="n">phonebook</span><span class="p">[</span><span class="s">&quot;Alice&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;+(13) 37 0000&quot;</span><span class="p">;</span> <span class="n">phonebook</span><span class="p">[</span><span class="s">&quot;Bob&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;+(13) 37 0000&quot;</span><span class="p">;</span> <span class="n">phonebook</span><span class="p">[</span><span class="s">&quot;Charlie&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;Alice&quot;</span><span class="p">;</span> <span class="c1">// Look stuff up</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;The phone number of Alice is &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">phonebook</span><span class="p">[</span><span class="s">&quot;Alice&quot;</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Number of phone book entries: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">phonebook</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// Print everything</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Iterate over all phonebook entries: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span><span class="o">=</span><span class="n">phonebook</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span><span class="o">!=</span><span class="n">phonebook</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span><span class="p">).</span><span class="n">first</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;: &quot;</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span><span class="p">).</span><span class="n">second</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Check if entry exists:</span> <span class="n">string</span> <span class="n">person</span> <span class="o">=</span> <span class="s">&quot;Bob&quot;</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Does &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">person</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; have a phone number ?&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span> <span class="o">=</span> <span class="n">phonebook</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">person</span><span class="p">);</span> <span class="k">if</span><span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">phonebook</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span> <span class="c1">//element found:</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Yes! His number is: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">second</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;No.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Map_(computer_science)">Map (Computer Science)</a></li> <li>C++ Reference: <a href="http://www.cplusplus.com/reference/map/map/">general information</a> and <a href="http://www.cplusplus.com/reference/map/map/map/">example</a></li> <li>Map is ordered collection (<a href="http://stackoverflow.com/a/4562771/562769">source</a>)</li> </ul> Google Code Jam – Round 1C 2013 http://martin-thoma.com/google-code-jam-round-1c-2013 Sun, 12 May 2013 13:01:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-round-1c-2013 <ul> <li>Problem A (<a href="https://code.google.com/codejam/contest/2437488/dashboard#s=p0">Consonants</a>): <ul> <li>Small Set: 4305/4834 users (89%)</li> <li>Large Set: 1551/3778 users (41%)</li> </ul> <li>Problem B (<a href="https://code.google.com/codejam/contest/2437488/dashboard#s=p1">Pogo</a>): <ul> <li>Small Set: 2537/3129 users (81%)</li> <li>Large Set: 121/638 users (19%)</li> </ul> </li> <li>Problem C (<a href="https://code.google.com/codejam/contest/2437488/dashboard#s=p2">The Great Wall</a>): <ul> <li>Small Set: 934/1260 users (74%)</li> <li>Large Set: 74/330 users (22%)</li> </ul> </li> </ul> <p>More information is on <a href="http://www.go-hero.net/jam/13/round/3">go-hero.net</a>.</p> <h2>Consonants</h2> <p>A solution from <a href="http://www.go-hero.net/jam/13/name/nip">nip</a>:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">vowels</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;e&#39;</span><span class="p">,</span> <span class="s">&#39;i&#39;</span><span class="p">,</span> <span class="s">&#39;o&#39;</span><span class="p">,</span> <span class="s">&#39;u&#39;</span><span class="p">}</span> <span class="n">nvalue</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span> <span class="c"># how many consecutive consonants</span> <span class="n">pos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="c"># position of the last substring of n consonants</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">vowels</span><span class="p">:</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">else</span><span class="p">:</span> <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">count</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="p">:</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">-</span> <span class="n">n</span> <span class="k">if</span> <span class="n">pos</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">nvalue</span> <span class="o">+=</span> <span class="n">pos</span> <span class="k">return</span> <span class="n">nvalue</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">name</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solve</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">n</span><span class="p">))))</span> </code></pre></div> <h2>Pogo</h2> <p>This is a very clever solution from xiaowuc1 (translated from Java to Python).</p> <p>The idea is to calculate at first the maximum number of steps you need and then go from your target destination to the origin.</p> <p>How many steps do you need? In the <code>$i$</code> round, you will make <code>$i$</code> steps. You need at least <code>$x+y$</code> steps to get from <code>$(0|0)$</code> to <code>$(x|y)$</code>. This means, you need to solve <code>$\sum_{i=1}^n i = x + y$</code> for <code>$n$</code>. This is <code>$\frac{n^2 + n}{2} = x+y$</code>. You might also need to make one extra step if the parity of <code>$\frac{n^2 + n}{2}$</code> is not the same as <code>$x+y$</code>. You can calculate this with a simple loop (see code below).</p> <p>After you know the maximum number of steps, you can apply a greedy solution: Start from <code>$(x|y)$</code> and always go into the direction that is farer away from the origin.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">calculateSteps</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">dist</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="nb">abs</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">while</span> <span class="p">(</span><span class="n">s</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">s</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span> <span class="o">&lt;</span> <span class="n">dist</span> <span class="ow">or</span> <span class="p">((</span><span class="n">s</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">s</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span> <span class="o">!=</span> <span class="n">dist</span><span class="o">%</span><span class="mi">2</span><span class="p">:</span> <span class="n">s</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">s</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; starting at (0|0) and going i steps, </span> <span class="sd"> how can you reach (x|y)? &quot;&quot;&quot;</span> <span class="n">s</span> <span class="o">=</span> <span class="n">calculateSteps</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="n">solution</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">abs</span><span class="p">(</span><span class="n">y</span><span class="p">):</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">solution</span> <span class="o">+=</span> <span class="s">&quot;E&quot;</span> <span class="n">x</span> <span class="o">-=</span> <span class="n">i</span> <span class="k">else</span><span class="p">:</span> <span class="n">solution</span> <span class="o">+=</span> <span class="s">&quot;W&quot;</span> <span class="n">x</span> <span class="o">+=</span> <span class="n">i</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">y</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">solution</span> <span class="o">+=</span> <span class="s">&quot;N&quot;</span> <span class="n">y</span> <span class="o">-=</span> <span class="n">i</span> <span class="k">else</span><span class="p">:</span> <span class="n">solution</span> <span class="o">+=</span> <span class="s">&quot;S&quot;</span> <span class="n">y</span> <span class="o">+=</span> <span class="n">i</span> <span class="k">return</span> <span class="n">solution</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solve</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)))</span> </code></pre></div> <h2>The Great Wall</h2> <p>The following solution is not applicable for the large input set, but it works fine for the small one:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span> <span class="k">def</span> <span class="nf">prepareTribes</span><span class="p">(</span><span class="n">tribes</span><span class="p">):</span> <span class="n">tribeStack</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">tribe</span> <span class="ow">in</span> <span class="n">tribes</span><span class="p">:</span> <span class="k">for</span> <span class="n">attackNumber</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;ni&quot;</span><span class="p">]):</span> <span class="n">tribeStack</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s">&quot;day&quot;</span> <span class="p">:</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;di&quot;</span><span class="p">]</span><span class="o">+</span><span class="n">attackNumber</span><span class="o">*</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;delta_di&quot;</span><span class="p">],</span> <span class="s">&quot;west&quot;</span><span class="p">:</span><span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;wi&quot;</span><span class="p">]</span><span class="o">+</span><span class="n">attackNumber</span><span class="o">*</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;delta_pi&quot;</span><span class="p">]),</span> <span class="s">&quot;east&quot;</span><span class="p">:</span><span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;ei&quot;</span><span class="p">]</span><span class="o">+</span><span class="n">attackNumber</span><span class="o">*</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;delta_pi&quot;</span><span class="p">]),</span> <span class="s">&quot;height&quot;</span><span class="p">:</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;si&quot;</span><span class="p">]</span><span class="o">+</span><span class="n">attackNumber</span><span class="o">*</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;delta_si&quot;</span><span class="p">]</span> <span class="p">})</span> <span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">tribeStack</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">tribe</span><span class="p">:</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;day&quot;</span><span class="p">])</span> <span class="k">def</span> <span class="nf">runAttack</span><span class="p">(</span><span class="n">wall</span><span class="p">,</span> <span class="n">tribe</span><span class="p">):</span> <span class="n">increase</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">tribe</span><span class="p">[</span><span class="s">&quot;west&quot;</span><span class="p">],</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;east&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">wall</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;height&quot;</span><span class="p">]:</span> <span class="c"># wall-ee</span> <span class="n">increase</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;wallPos&quot;</span> <span class="p">:</span> <span class="n">i</span><span class="p">,</span> <span class="s">&quot;height&quot;</span> <span class="p">:</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;height&quot;</span><span class="p">]})</span> <span class="k">return</span> <span class="n">increase</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">tribes</span><span class="p">):</span> <span class="n">wall</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span> <span class="n">tribeStack</span> <span class="o">=</span> <span class="n">prepareTribes</span><span class="p">(</span><span class="n">tribes</span><span class="p">)</span> <span class="c">#for tribe in tribeStack:</span> <span class="c"># print tribe[&quot;day&quot;], &quot;[&quot; + str(tribe[&quot;west&quot;]) + &quot;,&quot; + str(tribe[&quot;east&quot;])+&quot;]&quot;, tribe[&quot;height&quot;]</span> <span class="n">successes</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">increase</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tribe</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">tribeStack</span><span class="p">):</span> <span class="n">increaseTmp</span> <span class="o">=</span> <span class="n">runAttack</span><span class="p">(</span><span class="n">wall</span><span class="p">,</span> <span class="n">tribe</span><span class="p">)</span> <span class="c">#print wall</span> <span class="c">#print tribe</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">increaseTmp</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">successes</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">increase</span> <span class="o">+=</span> <span class="n">increaseTmp</span> <span class="k">if</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="o">==</span><span class="nb">len</span><span class="p">(</span><span class="n">tribeStack</span><span class="p">)</span> <span class="ow">or</span> <span class="n">tribeStack</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="s">&quot;day&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">tribe</span><span class="p">[</span><span class="s">&quot;day&quot;</span><span class="p">]:</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">increase</span><span class="p">:</span> <span class="k">if</span> <span class="n">wall</span><span class="p">[</span><span class="n">el</span><span class="p">[</span><span class="s">&quot;wallPos&quot;</span><span class="p">]]</span> <span class="o">&lt;</span> <span class="n">el</span><span class="p">[</span><span class="s">&quot;height&quot;</span><span class="p">]:</span> <span class="n">wall</span><span class="p">[</span><span class="n">el</span><span class="p">[</span><span class="s">&quot;wallPos&quot;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">el</span><span class="p">[</span><span class="s">&quot;height&quot;</span><span class="p">]</span> <span class="k">return</span> <span class="n">successes</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">N</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="c"># Number of tribes attacking the wall</span> <span class="n">tribes</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">tribe</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="n">di</span><span class="p">,</span> <span class="n">ni</span><span class="p">,</span> <span class="n">wi</span><span class="p">,</span> <span class="n">ei</span><span class="p">,</span> <span class="n">si</span><span class="p">,</span> <span class="n">delta_di</span><span class="p">,</span> <span class="n">delta_pi</span><span class="p">,</span> <span class="n">delta_si</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span> <span class="n">tribes</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&quot;di&quot;</span><span class="p">:</span><span class="nb">int</span><span class="p">(</span><span class="n">di</span><span class="p">),</span> <span class="c"># the day of the tribe&#39;s first attack</span> <span class="s">&quot;ni&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">ni</span><span class="p">),</span> <span class="c"># the number of attacks from this tribe</span> <span class="s">&quot;wi&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">wi</span><span class="p">),</span> <span class="c"># the westmost </span> <span class="s">&quot;ei&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">ei</span><span class="p">),</span> <span class="c"># and eastmost points respectively of the Wall attacked on the first attack</span> <span class="s">&quot;si&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">si</span><span class="p">),</span> <span class="c"># the strength of the first attack</span> <span class="s">&quot;delta_di&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">delta_di</span><span class="p">),</span> <span class="c"># the number of days between subsequent attacks by this tribe</span> <span class="s">&quot;delta_pi&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">delta_pi</span><span class="p">),</span> <span class="c"># the distance this tribe travels to the east between subsequent attacks (if this is negative, the tribe travels to the west)</span> <span class="s">&quot;delta_si&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">delta_si</span><span class="p">)</span> <span class="c"># the change in strength between subsequent attacks</span> <span class="p">})</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solve</span><span class="p">(</span><span class="n">tribes</span><span class="p">)))</span> </code></pre></div> <p>By the way, nobody has solved the large input set of this one with Python! But here is a <a href="http://www.go-hero.net/jam/13/name/eatmore">Java solution</a>.</p> How do hash functions work? http://martin-thoma.com/how-do-hash-functions-work Sat, 11 May 2013 18:07:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-do-hash-functions-work <p>Everybody who has written a noticeable amount of Java code should know the method <code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()">hashCode</a>()</code>. But most beginners have difficulties to understand the significance of this little method. The following article gives you one small example with some impressions how much hash functions influence execution time.</p> <h2>Connect four</h2> <blockquote>Connect Four [...] is a two-player game in which the players first choose a color and then take turns dropping colored discs from the top into a seven-column, six-row vertically-suspended grid. The pieces fall straight down, occupying the next available space within the column. The object of the game is to connect four of one's own discs of the same color next to each other vertically, horizontally, or diagonally before your opponent. </blockquote> <p><small>Source: <a href="http://en.wikipedia.org/wiki/Connect_Four">Wikipedia</a></small></p> <p>It looks like this:</p> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2013/05/connect-four.gif"><img src="../images/2013/05/connect-four.gif" alt="" width="320" height="190" class="size-full wp-image-65311"/></a><p class="wp-caption-text"></p></div> <h2>The task</h2> <p>Imagine you would like to find a good strategy where to drop your disk. A simple brute-force method is to create a so called <a href="http://en.wikipedia.org/wiki/Game_tree">game tree</a>. This means you go through each possibility at each situation that could occur in the game for both players. </p> <p>This approach has generally two problems: <ol> <li>You have to know how to go through each situation. For connect four it is easy. Both players place their disks in turns and in every turn the current player has at most 7 possibilities. But it is impossible for games like <a href="http://en.wikipedia.org/wiki/Calvinball#Calvinball">Calvinball</a> or <a href="http://en.wikipedia.org/wiki/Mao_(card_game)">Mao</a>.</li> <li>The game tree might be HUGE. In this case, you can have <code>$4,531,985,219,092 \approx 4.5 \cdot 10^{12}$</code> game situations (<a href="http://math.stackexchange.com/a/301128/6876">source</a>). Even if you would need only one bit for each situation, it would require 566.5 GB!</li> </ol></p> <p>Anyway, lets say we want to store many unique game situations. Unique means, even if you have hundreds of possible paths to get to a given game situations, you will store this game situation only once.</p> <h2>Implementation</h2> <p>First of all, I would like to mention that you can <a href="#How_is_this_realated_to_hash_functions">skip the source code</a>. I&#39;ve only included it to make it easier to understand what I&#39;m talking about.</p> <p>Lets say our game situation looks like this:</p> <div class="highlight"><pre><code class="c"><span class="k">struct</span> <span class="n">gamesituation</span> <span class="p">{</span> <span class="cm">/** How does the board currently look like? */</span> <span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">];</span> <span class="cm">/**</span> <span class="cm"> * What are the next game situations that I can reach from this </span> <span class="cm"> * board? </span> <span class="cm"> * The next[i] means that the player dropped the disc at column i</span> <span class="cm"> */</span> <span class="kt">int</span> <span class="n">next</span><span class="p">[</span><span class="mi">7</span><span class="p">];</span> <span class="cm">/* I could use a bitfield for this ... but it would make access</span> <span class="cm"> * much more inconvenient. </span> <span class="cm"> */</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">isEmpty</span><span class="p">;</span> <span class="c1">// Is this gamesitatution already filled?</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">isFinished</span><span class="p">;</span> <span class="c1">// Is this game finished?</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">stalemate</span><span class="p">;</span> <span class="c1">// Was this game a stalemate?</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">winRed</span><span class="p">;</span> <span class="c1">// Did red win?</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">winBlack</span><span class="p">;</span> <span class="c1">// Did black win?</span> <span class="p">};</span> </code></pre></div> <p>You need a check if one player won:</p> <div class="highlight"><pre><code class="c"><span class="cm">/*</span> <span class="cm"> * Check if player has won by placing a disc on (x,y). </span> <span class="cm"> * with direction (xDir, yDir)</span> <span class="cm"> * @return 1 iff RED won, -1 iff BLACK won and 0 if nobody won</span> <span class="cm"> */</span> <span class="kt">signed</span> <span class="kt">char</span> <span class="nf">hasPlayerWon</span><span class="p">(</span><span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">],</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">char</span> <span class="n">xDir</span><span class="p">,</span> <span class="kt">char</span> <span class="n">yDir</span><span class="p">)</span> <span class="p">{</span> <span class="kt">char</span> <span class="n">color</span> <span class="o">=</span> <span class="n">board</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span> <span class="kt">int</span> <span class="n">tokensInRow</span> <span class="o">=</span> <span class="n">getTokensInRow</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">xDir</span><span class="p">,</span> <span class="n">yDir</span><span class="p">)</span> <span class="o">+</span> <span class="n">getTokensInRow</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="n">xDir</span><span class="p">,</span> <span class="o">-</span><span class="n">yDir</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">tokensInRow</span> <span class="o">&gt;=</span> <span class="n">WINNING_NR</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">color</span> <span class="o">==</span> <span class="n">RED</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">color</span> <span class="o">==</span> <span class="n">BLACK</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">perror</span><span class="p">(</span><span class="s">&quot;this color doesn&#39;t / shouldn&#39;t exist</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="cm">/* </span> <span class="cm"> * A new disc has been dropped. Check if this disc means that </span> <span class="cm"> * somebody won.</span> <span class="cm"> * @return 1 iff RED won, -1 iff BLACK won, otherwise NOT_FINISHED</span> <span class="cm"> */</span> <span class="kt">int</span> <span class="nf">isBoardFinished</span><span class="p">(</span><span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">],</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="kt">signed</span> <span class="kt">char</span> <span class="n">status</span><span class="p">;</span> <span class="c1">// check left-right</span> <span class="n">status</span> <span class="o">=</span> <span class="n">hasPlayerWon</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">status</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// top-down</span> <span class="n">status</span> <span class="o">=</span> <span class="n">hasPlayerWon</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">status</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// down-left to top-right</span> <span class="n">status</span> <span class="o">=</span> <span class="n">hasPlayerWon</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">status</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// top-left to down-right</span> <span class="n">status</span> <span class="o">=</span> <span class="n">hasPlayerWon</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">status</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">NOT_FINISHED</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>If you need an explanation for this, you should read <a href="../check-x-in-a-row-for-board-games/" title="Check x-in-a-row for board games">this article</a>.</p> <p>And you need a function that can mirror boards (to get rid of identical, but mirrored situations) and one that can compare boards:</p> <div class="highlight"><pre><code class="c"><span class="kt">char</span> <span class="nf">isSameBoard</span><span class="p">(</span><span class="kt">char</span> <span class="n">a</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">],</span> <span class="kt">char</span> <span class="n">b</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">])</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">BOARD_WIDTH</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">BOARD_HEIGHT</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">!=</span> <span class="n">b</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">])</span> <span class="p">{</span> <span class="k">return</span> <span class="n">FALSE</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">mirrorBoard</span><span class="p">(</span><span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">],</span> <span class="kt">char</span> <span class="n">newBoard</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">])</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">BOARD_WIDTH</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">BOARD_HEIGHT</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">newBoard</span><span class="p">[</span><span class="n">BOARD_WIDTH</span> <span class="o">-</span> <span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">board</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <p>You need a function that makes all possible moves for the players:</p> <div class="highlight"><pre><code class="c"><span class="cm">/*</span> <span class="cm"> * Make all possible turns that the player can make in this</span> <span class="cm"> * game situation.</span> <span class="cm"> */</span> <span class="kt">void</span> <span class="nf">makeTurns</span><span class="p">(</span><span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">],</span> <span class="kt">char</span> <span class="n">currentPlayer</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">lastId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">recursion</span><span class="p">)</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">insertID</span><span class="p">;</span> <span class="kt">int</span> <span class="n">outcome</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">column</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">column</span> <span class="o">&lt;</span> <span class="n">BOARD_WIDTH</span><span class="p">;</span> <span class="n">column</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// add to column</span> <span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="n">BOARD_HEIGHT</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// the disc falls down</span> <span class="k">while</span> <span class="p">(</span><span class="n">height</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">board</span><span class="p">[</span><span class="n">column</span><span class="p">][</span><span class="n">height</span><span class="p">]</span> <span class="o">==</span> <span class="n">EMPTY</span><span class="p">)</span> <span class="p">{</span> <span class="n">height</span><span class="o">--</span><span class="p">;</span> <span class="p">}</span> <span class="n">height</span><span class="o">++</span><span class="p">;</span> <span class="c1">// this colum is full</span> <span class="k">if</span> <span class="p">(</span><span class="n">height</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span> <span class="k">continue</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// place disc</span> <span class="n">board</span><span class="p">[</span><span class="n">column</span><span class="p">][</span><span class="n">height</span><span class="p">]</span> <span class="o">=</span> <span class="n">currentPlayer</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">didBoardAlreadyOccur</span><span class="p">(</span><span class="n">board</span><span class="p">))</span> <span class="p">{</span> <span class="c1">// I&#39;ve already got to this situation</span> <span class="n">insertID</span> <span class="o">=</span> <span class="n">getBoardIndex</span><span class="p">(</span><span class="n">board</span><span class="p">);</span> <span class="n">savePreviousID</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">lastId</span><span class="p">,</span> <span class="n">column</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">char</span> <span class="n">mirrored</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">];</span> <span class="n">mirrorBoard</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">mirrored</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">didBoardAlreadyOccur</span><span class="p">(</span><span class="n">mirrored</span><span class="p">))</span> <span class="p">{</span> <span class="c1">// I&#39;ve already got this situation, but mirrored</span> <span class="c1">// so take care of symmetry at this point</span> <span class="n">mirroredCounter</span><span class="o">++</span><span class="p">;</span> <span class="n">insertID</span> <span class="o">=</span> <span class="n">getBoardIndex</span><span class="p">(</span><span class="n">mirrored</span><span class="p">);</span> <span class="n">savePreviousID</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">lastId</span><span class="p">,</span> <span class="n">column</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">registeredSituations</span><span class="o">++</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">registeredSituations</span> <span class="o">==</span> <span class="n">MAXIMUM_SITUATIONS</span><span class="p">)</span> <span class="p">{</span> <span class="n">giveCurrentInformation</span><span class="p">();</span> <span class="n">exit</span><span class="p">(</span><span class="n">MAXIMUM_SITUATIONS_REACHED_EXIT_STATUS</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">REGISTERED_MOD</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">registeredSituations</span> <span class="o">%</span> <span class="n">REGISTERED_MOD</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">giveCurrentInformation</span><span class="p">();</span> <span class="p">}</span> <span class="n">outcome</span> <span class="o">=</span> <span class="n">isBoardFinished</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">height</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">ABS</span><span class="p">(</span><span class="n">outcome</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// the game is finished</span> <span class="n">insertID</span> <span class="o">=</span> <span class="n">getNewIndex</span><span class="p">(</span><span class="n">board</span><span class="p">);</span> <span class="n">storeToDatabase</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">board</span><span class="p">,</span> <span class="n">TRUE</span><span class="p">,</span> <span class="n">outcome</span><span class="p">);</span> <span class="n">savePreviousID</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">lastId</span><span class="p">,</span> <span class="n">column</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// Switch players</span> <span class="k">if</span> <span class="p">(</span><span class="n">currentPlayer</span> <span class="o">==</span> <span class="n">RED</span><span class="p">)</span> <span class="p">{</span> <span class="n">currentPlayer</span> <span class="o">=</span> <span class="n">BLACK</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">currentPlayer</span> <span class="o">=</span> <span class="n">RED</span><span class="p">;</span> <span class="p">}</span> <span class="n">insertID</span> <span class="o">=</span> <span class="n">getNewIndex</span><span class="p">(</span><span class="n">board</span><span class="p">);</span> <span class="n">setBoard</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">board</span><span class="p">);</span> <span class="n">savePreviousID</span><span class="p">(</span><span class="n">insertID</span><span class="p">,</span> <span class="n">lastId</span><span class="p">,</span> <span class="n">column</span><span class="p">);</span> <span class="kt">char</span> <span class="n">copy</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">BOARD_WIDTH</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">BOARD_HEIGHT</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">copy</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">board</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="n">makeTurns</span><span class="p">(</span><span class="n">copy</span><span class="p">,</span> <span class="n">currentPlayer</span><span class="p">,</span> <span class="n">insertID</span><span class="p">,</span> <span class="n">recursion</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <h2>How is this realated to hash functions?</h2> <p>You might have noticed a few functions that I didn&#39;t explain by now: <ul> <li><code>didBoardAlreadyOccur(board)</code>: Checks if a given board is stored in database.</li> <li><code>getBoardIndex(board)</code>: This is a function that takes a board and gives a non-negative integer which is characteristic for the given board.</li> <li><code>savePreviousID(insertID, lastId, column)</code>: store insertID as a possible next situation for lastId in database</li> <li><code>setBoard(insertID, board)</code>: Insert board into database at position insertID</li> </ul></p> <p>How would you implement <code>didBoardAlreadyOccur(board)</code>? This function (or insertID) will be the slowest part of the code and will be called VERY often. So it needs to be as fast as possible.</p> <h2>A hash function</h2> <p>Most of the time you can create hash functions by mapping values to integers. In my case, I mapped the board - which is a two-dimensional char array - to one integer by thinking of it as a very long number. I think of a red disc as the digit 1, a black disc as the digit 2 and an empty field as 0:</p> <div class="highlight"><pre><code class="c"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">charToInt</span><span class="p">(</span><span class="kt">char</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">RED</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">BLACK</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">2</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <p>When you want to get the board number, you can get it like this: <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2013/05/connect-four-to-number.png"><img src="../images/2013/05/connect-four-to-number.png" alt="" width="320" height="380" class="size-full wp-image-65761"/></a><p class="wp-caption-text"></p></div></p> <p>For most game situations, this number will be much too big to store it in an integer. Also, we would like to get an index for our array so that we know where to store this board. The simplest solution to this problem is to calculate <code>NUMBER % ARRAY_SIZE</code>:</p> <div class="highlight"><pre><code class="c"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">getFirstIndex</span><span class="p">(</span><span class="kt">char</span> <span class="n">board</span><span class="p">[</span><span class="n">BOARD_WIDTH</span><span class="p">][</span><span class="n">BOARD_HEIGHT</span><span class="p">])</span> <span class="p">{</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">BOARD_WIDTH</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">BOARD_HEIGHT</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">index</span> <span class="o">+=</span> <span class="n">charToInt</span><span class="p">(</span><span class="n">board</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">])</span> <span class="o">*</span> <span class="n">myPow</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span> <span class="o">*</span> <span class="n">BOARD_WIDTH</span><span class="p">)</span> <span class="o">%</span> <span class="n">HASH_MODULO</span><span class="p">));</span> <span class="p">}</span> <span class="p">}</span> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">%</span> <span class="n">MAXIMUM_SITUATIONS</span><span class="p">;</span> <span class="k">return</span> <span class="n">index</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>The function <code>getFirstIndex</code> maps an char Array with BOARD<em>WIDTH * BOARD</em>HEIGHT = 7 * 6 = 42 elements to an integer interval [0, MAXIMUM_SITUATIONS] = [0, 20000000]. Although I only use three values for the char array, that is <code>$3^{42} = 109418989131512359209 \approx 1.09 \cdot 10^{20}$</code>. There are many game situation numbers that can never occur (e.g. two more red than black dists), but we still map a significantly larger space to [0,20000000]. You can&#39;t change that. You can probably find (much) better mappings, but as we know that there are <code>$4.5 \cdot 10^{12}$</code> game situations, you will always have the problem that your codomain is much smaller than the domain of your hash function. That&#39;s a fundamental problem of hash functions.</p> <p>This means, you will have two board situations that map to the same hash number. This is called a &quot;hash collision&quot;. When you use the hash number directly as an index for your board, you will have to deal with hash collisions. Some solutions are: <ul> <li>Ignoring the problem: That&#39;s boring and not always possible (but simple).</li> <li>Linear probing</li> <li>Quadratic probing</li> </ul></p> <h2>Linear probing</h2> <p>The idea of linear probing is very simple: </p> <p>Inserting a new item: <ol> <li>You look at the index <code>$i$</code> that your hash function gave you.</li> <li>If this index is already full, you look at <code>$i+1$</code></li> <li>When you took a look at all slots of your array, you can&#39;t insert the new item.</li> </ol></p> <p>Searching for an already inserted item: <ol> <li>You look at the index <code>$i$</code> that your hash function gave you.</li> <li>If <code>$i$</code> is empty, you&#39;re ready. The item was not inserted.</li> <li>If <code>$i$</code> is not the item you&#39;ve searched for, you have to look at <code>$i+1$</code>.</li> <li>Keep looking at the next item until you find your searched item, you&#39;ve looked at all items or you find an empty slot.</li> </ol></p> <p>Deleting is complicated. You have to look at all items after the deleted one, remove them from your array and insert them again. That&#39;s not good.</p> <p>The problem of linear probing is <strong>clustering</strong>. When you have some hash values that are close together, you might get hash collisions faster. When you&#39;ve got your first collisions, you resolve them by inserting the value close to the value where you originally wanted to save it. So you get one big cluster quite fast. When you want to insert an element in the cluster, you first have to search the end of the cluster. That&#39;s bad for performance.</p> <p>An advantage of linear probing compared to quadratic probing is that you might get a better performance due to cache effects.</p> <h2>Quadratic probing</h2> <p>The idea of quadratic probing is the same as for linear probing, but you try to fix the clustering-problem by using a clever way to search for a free spot:</p> <p><code>$h_i(x) = \left(h(x) + (-1)^{i+1} \cdot \left\lceil\frac{i}{2}\right\rceil^2\right) \bmod~m$</code></p> <p>where <code>$h$</code> is your hash function and <code>$i$</code> is your i-th try to find a free spot while you have <code>$m$</code> spots in total.</p> <p>This one also suffers from clustering, but it&#39;s not as bad as with linear clustering.</p> <h2>Double hashing</h2> <p>This solution could be the best one, but also the hardest one to implement correctly. You could find a free spot by using a second hash function <code>$h&#39;$</code> like this:</p> <p><code>$h_i(x) = (h(x)+h&#39;(x)\cdot i) ~ \bmod ~ m$</code></p> <p>BUT you have to make sure that <code>$Pr[h(x)=h(y) \land h&#39;(x)=h&#39;(y)] = \frac{1}{m^2}$</code></p> <h2>Performance</h2> <p>You can use linear probing, quadratic probing and double hashing in my example and measure how many game situations get stored. The more game situations you can store in the same amount of time, the better:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/connectfour-probing.png"><img src="../images/2013/05/connectfour-probing.png" alt="" width="512" height="334" class="size-full wp-image-65871"/></a><p class="wp-caption-text"></p></div> <p>You can see that linear probing performs much worse than quadratic probing and double hashing. When you compare quadratic probing with double hashing, there seems not to be a big difference. But note that my second hash function is almost the same as the first one. You could probably choose a better second hash function and get better results (suggestions are welcome).</p> <h2>Why are hash functions important?</h2> <p>Hash functions help you to map a big amount of data to a small space. They are important, because they are a relevant part of many datastructures. The better they are, the faster will operations on those datastructures work. Better means: Faster to compute or less collisions.</p> <p>Some datastructures like this are: <ul> <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html">HashMap</a> and <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html">HashTable</a> (&rarr; <a href="http://stackoverflow.com/a/40878/562769">difference</a>)</li> <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html">HashSet</a></li> </ul></p> <h2>Final notes</h2> <p>Another resolution for hash collisions is creating a linked list. This means you will not suffer from clustering and you can insert in <code>$\mathcal{O}(1)$</code>. But searching for an element is still in <code>$\mathcal{O}(n)$</code>, where <code>$n$</code> is the number of elements that were already inserted.</p> <h2>Resources</h2> <p>You can find the <a href="https://github.com/MartinThoma/connect-four/tree/master/C">code at GitHub</a>.</p> Google Code Jam – Round 1B 2013 http://martin-thoma.com/google-code-jam-round-1b-2013 Sun, 05 May 2013 14:15:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-round-1b-2013 <ul> <li>Problem A (<a href="https://code.google.com/codejam/contest/2434486/dashboard#s=p0">Osmos</a>): <ul> <li>Small Set: 4668/7250 users (64%)</li> <li>Large Set: 3537/4578 users (77%)</li> </ul> <li>Problem B (<a href="https://code.google.com/codejam/contest/2434486/dashboard#s=p1">Falling Diamonds</a>): <ul> <li>Small Set: 952/1882 users (51%)</li> <li>Large Set: 525/724 users (73%)</li> </ul> </li> <li>Problem C (<a href="https://code.google.com/codejam/contest/2434486/dashboard#s=p2">Garbled Email</a>): <ul> <li>Small Set: 444/896 users (50%)</li> <li>Large Set: 255/345 users (74%)</li> </ul> </li> </ul> <p>More information are on <a href="http://www.go-hero.net/jam/13/round/2">go-hero.net</a>.</p> <h2>Osmos</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">howBigDoIget</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">):</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">motes</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">A</span> <span class="o">&gt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">motes</span><span class="p">):</span> <span class="n">A</span> <span class="o">+=</span> <span class="nb">min</span><span class="p">(</span><span class="n">motes</span><span class="p">)</span> <span class="n">motes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">motes</span><span class="p">))</span> <span class="k">return</span> <span class="n">A</span> <span class="k">def</span> <span class="nf">stepsNeededForNext</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">):</span> <span class="n">m</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">motes</span><span class="p">)</span> <span class="n">steps</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">m</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">A</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">10</span><span class="o">**</span><span class="mi">12</span> <span class="k">while</span> <span class="n">A</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">:</span> <span class="n">A</span> <span class="o">+=</span> <span class="p">(</span><span class="n">A</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">steps</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">steps</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">):</span> <span class="n">steps</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">A</span> <span class="o">=</span> <span class="n">howBigDoIget</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">)</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">motes</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">A</span> <span class="o">&lt;=</span> <span class="nb">max</span><span class="p">(</span><span class="n">motes</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="n">stepsNeededForNext</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">motes</span><span class="p">)):</span> <span class="n">steps</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">motes</span><span class="p">)</span> <span class="k">return</span> <span class="n">steps</span> <span class="k">else</span><span class="p">:</span> <span class="n">A</span> <span class="o">+=</span> <span class="p">(</span><span class="n">A</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">A</span> <span class="o">=</span> <span class="n">howBigDoIget</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">)</span> <span class="n">steps</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">steps</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">A</span><span class="p">,</span> <span class="n">N</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span><span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">))</span> <span class="n">motes</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span><span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)))</span> <span class="n">copyed</span> <span class="o">=</span> <span class="n">motes</span><span class="p">[:]</span> <span class="n">solution</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">motes</span><span class="p">)</span> <span class="k">if</span> <span class="n">solution</span> <span class="o">&gt;</span> <span class="n">N</span><span class="p">:</span> <span class="n">solution</span> <span class="o">=</span> <span class="n">N</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solution</span><span class="p">))</span> </code></pre></div> <h2>Falling Diamonds</h2> <p>Oncee you&#39;ve read the task, you should understand some very basic ideas:</p> <ul> <li>First of all, diamonds only fall at `$x=0$`!</li> <li>If your target coordinates are `$(x,y)$`, you have the same output as for `$(-x,y)$`, as everything is symmetric.</li> <li>You have to get a basis for your diamonds pyramid. I've colored the basis in yellow in the images below.</li> <li>When your target is above the ground, you can let the diamond slide down to calculate the size of the basis.</li> </ul> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/falling-diamonds-base.jpg"><img src="../images/2013/05/falling-diamonds-base.jpg" alt="" width="512" height="323" class="size-full wp-image-65431"/></a><p class="wp-caption-text"></p></div> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/05/falling-diamonds-slide.jpg"><img src="../images/2013/05/falling-diamonds-slide.jpg" alt="" width="512" height="254" class="size-full wp-image-65441"/></a><p class="wp-caption-text"></p></div> <p>Note that you don&#39;t have to calculate a probabilty for the yellow pyramids. You get those with probability of 1.</p> <p>What I&#39;ve forgot: You should also catch the case that you can fill up the next bigger pyramid. If this is possible, you can guarantee that you will reach your target <code>$(x,y)$</code>.</p> <p>The rest is simple math. You have <code>$rest$</code> diamonds left after you&#39;ve build the base (yellow). Then you need <code>$y+1$</code> diamonds slide to the right side. The probability that you have exactly <code>$k$</code> hits while making <code>$N$</code> tries with a probability of 50% is <code>$\binom{N}{k} \cdot (\frac{1}{2})^N$</code>. You want at least <code>$k$</code> hits, so you want <code>$\sum_{i=k}^N \binom{N}{i} \cdot (\frac{1}{2})^N$</code>.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">gmpy</span> <span class="sd">&quot;&quot;&quot; Calculate the binomial coefficient &quot;&quot;&quot;</span> <span class="k">def</span> <span class="nf">binomial</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span> <span class="k">return</span> <span class="n">gmpy</span><span class="o">.</span><span class="n">comb</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">k</span><span class="p">)</span> <span class="sd">&quot;&quot;&quot; </span> <span class="sd"> @param N: Number of diamonds</span> <span class="sd"> @param x,y: Target coordinate</span> <span class="sd"> @return: possiblity, that a diamond will be at coordinate (x,y) </span> <span class="sd">&quot;&quot;&quot;</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">n</span> <span class="o">=</span> <span class="n">y</span><span class="o">+</span><span class="mi">1</span> <span class="k">if</span> <span class="n">N</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="n">n</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="n">n</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="mf">1.0</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mf">0.0</span> <span class="c"># From this point, x != 0 is True</span> <span class="n">xTmp</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span> <span class="c"># let target slide down</span> <span class="n">n</span> <span class="o">=</span> <span class="n">xTmp</span><span class="o">-</span><span class="mi">1</span> <span class="n">baseDiamands</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">n</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span> <span class="c"># are there enough diamonds left after you&#39;ve build the basis?</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">N</span> <span class="o">-</span> <span class="n">baseDiamands</span> <span class="k">if</span> <span class="n">rest</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="mf">0.0</span> <span class="c"># are there enough diamonds left so that you can guarantee that </span> <span class="c"># you will fill up the next bigger pyramid at least to the </span> <span class="c"># target position?</span> <span class="n">biggerBaseDiamonds</span> <span class="o">=</span> <span class="n">baseDiamands</span><span class="o">+</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="o">+</span><span class="n">y</span> <span class="k">if</span> <span class="n">N</span> <span class="o">&gt;=</span> <span class="n">biggerBaseDiamonds</span><span class="p">:</span> <span class="k">return</span> <span class="mf">1.0</span> <span class="c"># some math:</span> <span class="c"># bernoulli</span> <span class="n">prob</span> <span class="o">=</span> <span class="mf">0.0</span> <span class="n">hitsNeeded</span> <span class="o">=</span> <span class="n">y</span><span class="o">+</span><span class="mi">1</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">hitsNeeded</span><span class="p">,</span> <span class="n">rest</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">prob</span> <span class="o">+=</span> <span class="n">binomial</span><span class="p">(</span><span class="n">rest</span><span class="p">,</span><span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="n">prob</span><span class="o">/</span><span class="mi">2</span><span class="o">**</span><span class="n">rest</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">N</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span><span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%.9Lf</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solve</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">y</span><span class="p">)))</span> </code></pre></div> Sicherheit-Klausur http://martin-thoma.com/sicherheit-klausur Mon, 29 Apr 2013 08:19:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sicherheit-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Sicherheit&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn <a href="http://www.iks.kit.edu/index.php?id=hofheinz">Jun.-Prof. Hofheinz</a> im Sommersemester 2013 geh&ouml;rt.</div> <p>An diesem Artikel wird nat&uuml;rlich noch gearbeitet.</p> <h2>Behandelter Stoff</h2> <table> <tr> <td>25.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Caesar, Vigenere, One-Time-Pad</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL01.pdf">VL 01</a></td> </tr> <tr> <td>22.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Symmetrische Verschl&uuml;sselungen; Stromchiffren; Blockchiffren (DES, AES); <span class="hint" title="ECB, CBC, CFB, OFB"><a href="http://commons.wikimedia.org/wiki/User:MartinThoma#Betriebsmodi">Betriebsmodi</a></span>: <table> <tr> <th rowspan="2">Modus</th> <th rowspan="2">Verschl&uuml;sselung<br/>Entschl&uuml;sselung</th> <th colspan="2">Parallelisierbarkeit</th> </tr> <tr> <th>verschl.</th> <th>entschl.</th> </tr> <tr> <td>ECB</td> <td>`$c_i = ENC(K, m_i)$`<br/>`$m_i = DEC(K, m_i)$`</td> <td>Ja</td> <td>Ja</td> </tr> <tr> <td>CBC</td> <td>`$c_i = ENC(K, m_i \oplus c_{i-1})$`<br/>`$m_i = DEC(K, c_i) \oplus c_{i-1}$`</td> <td>Nein</td> <td>Ja</td> </tr> <tr> <td>CFB</td> <td>`$c_i = m_i \oplus ENC(K, c_{i-1})$`<br/>`$m_i = c_i \oplus ENC(K, c_{i-1})$`</td> <td>Nein</td> <td>Ja</td> </tr> <tr> <td>OFB</td> <td>`$c_i = m_i \oplus ENC(K, IV)^i$`<br/>`$m_i = c_i \oplus ENC(K, IV)^i$`</td> <td>Nein</td> <td>Nein</td> </tr> </table> <a href="http://commons.wikimedia.org/wiki/File:DES-main-network.png">DES-Feistelstruktur</a> </td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL02.pdf">VL 02</a></td> </tr> <tr> <td>25.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Lineare Kryptoanalyse, Differentielle Kryptoanalyse, <a href="../semantische-sicherheit/" title="Semantische Sicherheit">Semantische Sicherheit</a>, <a href="../sicherheit-klausur/#Fragen">IND-CPA</a>, Feistel-Schema</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL03.pdf">VL 03</a></td> </tr> <tr> <td>29.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;"><span class="hint" title="128 Bit, 160 Bit und 256 Bit hashes sind &uuml;blich">Hashfunktionen</span>, <a href="../kollisionsresistente-hashfunktionen-und-einwegfunktionen/">Kollisionsresistenz `$\Rightarrow$` Einwegeigenschaft</a>, <span class="hint" title="Beeinflusste MD5, SHA-1, SHA-2. SHA-3 benutzt MD nicht.">Merkle-Damgard-Konstruktion</span> und Length-Extension-Problematik, Birthday Attack, Meet-in-the-Middle-Angriff</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL04.pdf">VL 04</a></td> </tr> <tr> <td>06.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Public-Key-Verschl&uuml;sselung (Idee, RSA); Meet-in-the-Middle-Angriff f&uuml;r Hashfunktionen</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL05.pdf">VL 05</a></td> </tr> <tr> <td>13.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Rest Public-Key-Verschl&uuml;sselung (ElGamal, Vergleich RSA/ElGamal), Symmetrische Authentifikation von Nachrichten (Sicherheitsmodell, Hash-then-Sign, <abbr title="Pseudorandom functions">PRFs</abbr>, <abbr title="Hash-based message authentication code">HMAC</abbr>), <a href="http://de.wikipedia.org/wiki/Message_Authentication_Code">MAC</a></td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL06.pdf">VL 06</a></td> </tr> <tr> <td>27.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Asymmetrische Authentifikation von Nachrichten (RSA-PSS, ElGamal, DSA)</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL07.pdf">VL 07</a></td> </tr> <tr> <td>03.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Schl&uuml;sselaustausch (<span class="hint" title="Kommunikation &uuml;ber Key Center. Wichtig ist vor allem ein Zeitstempel.">Kerberos</span>, TLS, Angriffe)</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL08.pdf">VL 08</a></td> </tr> <tr> <td>10.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Schl&uuml;sselaustausch (TLS-Angriffe, weitere Verfahren), Identifikationsprotokolle</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL09.pdf">VL 09</a></td> </tr> <tr> <td>13.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Identifikationsprotokolle (Sicherheitsanalyse), Zero-Knowledge-Protokolle, Commitment &rarr; Hiding</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL10.pdf">VL 10</a></td> </tr> <tr> <td>17.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Zero-Knowledge-Protokolle, Nutzerauthentifikation</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL11.pdf">VL 11</a></td> </tr> <tr> <td>24.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Nutzerauthentifikation (W&ouml;rterbuchangriffe, interaktive Authentifikation, positionsbasierte Kryptographie); Rainbowtables; LM-Hashes</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL12.pdf">VL 12</a></td> </tr> <tr> <td>27.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Nutzerauthentifikation (positionsbasierte Kryptographie), Zugriffskontrolle (Bell-LaPadula)</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL13.pdf">VL 13</a></td> </tr> <tr> <td>01.07.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Zugriffskontrolle (Bell-LaPadula, Chinese Wall), Analyse gr&ouml;&szlig;erer Systeme</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL14.pdf">VL 14</a></td> </tr> <tr> <td>08.07.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Analyse gr&ouml;&szlig;erer Systeme, h&auml;ufige Sicherheitsprobleme</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL15.pdf">VL 15</a></td> </tr> <tr> <td>11.07.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">H&auml;ufige Sicherheitsprobleme</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL16.pdf">VL 16</a></td> </tr> </table> <p>Falls hier was fehlt, k&ouml;nnt ihr mich gerne in den Kommentaren oder per Mail (info@martin-thoma.de) darauf aufmerksam machen. Ich bin ja mal gespannt, ob ich das bis zum Ende aktuell halte.</p> <h2>Definitionen und S&auml;tze</h2> <div class="definition"> Eine &uuml;ber `$k$` parametrisierte Funktion `$H$` ist <strong>kollisionsresistent</strong>, wenn jeder PPT-Algorithmus nur mit h&ouml;chstens vernachl&auml;ssigbarer Wahrscheinlichkeit eine Kollision findet. F&uuml;r jeden PPT-Algorithmus `$\mathcal{A}$` ist `$Adv^{cr}_{H,\mathcal{A}}(k) := Pr[(X,X') \leftarrow \mathcal{A}(1^k): X \neq X' \land H_k(X) = H_k(X')]$` vernachl&auml;ssigbar. </div> <div class="definition"> Eine &uuml;ber `$k$` parametrisierte Funktion `$H$` ist eine <strong>Einwegfunktion</strong> bzgl. der Urbildverteilung `$\mathcal{X}_k$`, wenn jeder PPT-Algorithmus nur mit h&ouml;chstens vernachl&auml;ssigbarer Wahrscheinlichkeit ein Urbild eines gegebenen, aus `$\mathcal{X}_k$` gezogenen Bildes findet. F&uuml;r jeden PPT-Algorithmus `$\mathcal{A}$` ist `$Adv^{cr}_{H,\mathcal{A}}(k) := Pr[X' \leftarrow \mathcal{A}(1^k, H(X)): H(X) = H(X')]$` vernachl&auml;ssigbar, wobei `$X \leftarrow \mathcal{X}_k$` gew&auml;hlt wurde. </div> <div class="theorem"> Jede kollisionsresistente Hashfunktion `$H:\{0,1\}^* \rightarrow \{0,1\}^k$` ist eine Einwegfunktion bzgl. der Gleichverteilung auf `$\{0,1\}^{2k}$`. </div> <div class="theorem"> Ist `$f$` eine kollisionsresistente Hashfunktion, so ist die Merkle&ndash;Damg&aring;rd-Konstruktion mit `$f$` kollisionsresistent. </div> <div class="theorem"> Hash-Then-Sign-Paradigma: Sei (Sig, Ver) EUF-CMA-sicher und H eine kollisionsresistente Hashfunktion. Dann ist der durch Sig'(K, M) = Sig(K, H(M)), Ver'(K, M, `$\sigma$`) = Ver(K, H(M), `$\sigma$`) erkl&auml;rte <abbr title="Message Authentification Code">MAC</abbr> EUF-CMA-sicher. </div> <h2>Fragen</h2> <div class="question"> <span class="question">Wann ist ein Verschl&uuml;sselungsschema IND-CPA-sicher?</span> <div class="answer"> IND-CPA bedeutet &bdquo;indistinguishability under chosen-plaintext attacks&ldquo;. Ein Verschl&uuml;sselungsschema ist genau dann IND-CPA-Sicher, wenn kein effizienter Angreifer `$\mathcal{A}$` Chiffrate von selbstgew&auml;hlten Klartexten unterscheiden kann. </div> <p></div></p> <div class="question"> <span class="question">Wann ist eine Signatur EUF-CMA-sicher?</span> <div class="answer"> EUF-CMA bedeutet &bdquo;existentially unforgeable under chosen-message attacks&ldquo;. Eine Signatur ist genau dann EUF-CMA-Sicher, wenn alle PPT-Angreifer `$\mathcal{A}$` folgendes Spiel nur vernachl&auml;ssigbar oft gewinnen: <ul> <li>`$\mathcal{A}$` hat Zugriff auf ein `$Sig(K, \cdot)$`-Orakel</li> <li>`$\mathcal{A}$` gibt als Ausgabe `$(M^*, \sigma^*)$`</li> <li>`$\mathcal{A}$` gewinnt, wenn `$Ver(K, M^*, \sigma^*) = 1$` und `$M^*$` &bdquo;frisch&ldquo; ist</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Was sind Replay-Angriffe?</span> <div class="answer"> Bei Replay-Angriffen f&auml;ngt der Angreifer einen Teil der Kommunikation von Alice und Bob ab. Sp&auml;ter schickt er diesen Teil ohne weitere Bearbeitung an einen der Beiden. </div> <p></div></p> <div class="question"> <span class="question">Was versteht man unter der Merkle&ndash;Damg&aring;rd-Konstruktion?</span> <div class="answer"> Die Merkle&ndash;Damg&aring;rd-Konstruktion ist eine Methode zur Konstruktion von kryptographischen Hash-Funktionen. Sie funktioniert so: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/04/merkle-damgard-300x139.png"><img src="../images/2013/04/merkle-damgard-300x139.png" alt="" width="300" height="139" class="size-medium wp-image-74091"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie funktioniert RSA?</span> <div class="answer"> <ol> <li>Generiere zwei Primzahlen `$p, q \in \mathbb{P}$`</li> <li>Berechne `$n := p \cdot q$` und `$\varphi(n) = (p-1) \cdot (q-1)$`</li> <li>W&auml;hle `$e$`, sodass gilt: `$ggT(e, \varphi(n)) = 1$` und `$1 < e < \varphi(n)$`</li> <li>Berechne `$d$`, sodass gilt: `$e \cdot d \equiv 1 \mod \varphi(n)$`</li> </ol> Verschl&uuml;sselung einer Nachricht `$m$`: `$c = m^{e} \mod n$` Verschl&uuml;sselung eines Ciphertextes `$c$`: `$m = c^{d} \mod n$` </div> <p></div></p> <div class="question"> <span class="question">Welches Problem birgt ein kleines `$e$` beim RSA-Verfahren?</span> <div class="answer"> Folgender Angriff ist f&uuml;r `$e=3$` m&ouml;glich: <ul> <li>Nachricht `$m$` wird an 3 Benutzer geschickt</li> <li>Angreifer kennt Chiffrate f&uuml;r `$N_1, N_2, N_3$`.</li> <li>Chinesischer Restsatz f&uuml;r `$m^3 \mod N_1 N_2 N_3$`.</li> <li>Wurzelziehen &uuml;ber `$\mathbb{Z}$` liefert `$m$`</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Was ist damit gemeint, wenn man sagt &bdquo;RSA ist Homomorph&ldquo;?</span> <div class="answer"> Homomorphie ist folgende (unerw&uuml;nschte) Eigenschaft: `$\begin{align} Enc(pk, m_1) \cdot Enc(pk, m_2) &= m_1^e \cdot m_2^e\\ &= (m_1 \cdot m_2)^e \\ &= Enc(pk, m_1 \cdot m_2) \end{align}$` Diese Eigenschaft ist z.B. in folgendem Szenario problematisch: Angenommen bei einer Auktion werden die gebotenen Geldbetr&auml;ge verschl&uuml;sselt. Dann kann ein Angreifer das Chiffrat (g&uuml;ltig) ver&auml;ndern. So kann er den Geldbetrag ohne Probleme verdoppeln. </div> <p></div></p> <div class="question"> <span class="question">Was sind <abbr title="Hash-based message authentication code">HMACs</abbr>?</span> <div class="answer"> Spezielle symmetrische Signaturen, die wie folgt aufgebaut sind: `$Sig(K, M) = H(K \oplus opad, H(K \oplus ipad, M))$` </div> <p></div></p> <div class="question"> <span class="question">Wie funktioniert <a href="http://de.wikipedia.org/wiki/Elgamal-Verschl%C3%BCsselungsverfahren">ElGamal</a>?</span> <div class="answer"> <ol> <li>W&auml;hle eine zyklische Gruppe `$\mathbb{G} = \langle g \rangle$`.</li> <li>`$pk = (\mathbb{G}, g, g^x)$`, `$sk=(\mathbb{G}, g, x)$`, wobei `$x$` zuf&auml;llig gew&auml;hlt wird.</li> </ol> Verschl&uuml;sselung einer Nachricht `$m$`: `$Enc(pk, m) = (g^y, g^{xy} \cdot m)$` mit zuf&auml;lligem `$y$` &rarr; Verschl&uuml;sselung ist zuf&auml;llig! Verschl&uuml;sselung eines Ciphertextes `$c$`: `$Dec(sk, (Y, Z)) = \frac{Z}{Y^x} = \frac{g^{xy} \cdot m}{(g^{y})^x} = m$` </div> <p></div></p> <div class="question"> <span class="question">Wie funktioniert das Kerberos-Schl&uuml;sselaustauschprotokoll?</span> <div class="answer"> <ul> <li>Alice schreibt dem <abbr title="Key Center">KC</abbr>, dass Alice und Bob gerne einen Schl&uuml;sselaustausch vornehmen wollen.</li> <li>Das KC schickt Alice ihren Schl&uuml;ssel `$K_A$`, den sie f&uuml;r die Kommunikation mit Bob verwenden kann. Zus&auml;tzlich wird ein Zeitstempel `$T_{KC}$`, eine G&uuml;ltigkeitsdauer `$L$` sowie ein frischer Schl&uuml;ssel `$K$` &uuml;bertragen.</li> <li>TODO!!!!</li> </ul> Ein <a href="http://www.youtube.com/watch?v=kp5d8Yv3-0c">gutes YouTube-Video</a> gibts auch. </div> <p></div></p> <div class="question"> <span class="question">Warum kann es schlecht f&uuml;r die Sicherheit sein, wenn man komprimiert?</span> <div class="answer"> Annahme: Ein Angreifer kann zu dem Geheimtext, der komprimiert wird, etwas vor der Kompression hinzuf&uuml;gen. Wenn der Ciphertext deutlich weniger w&auml;chst als er an Text hinzugef&uuml;gt hat, kann er vermuten, dass er den Text erraten hat. (&rarr; CRIME-Angriff) </div> <p></div></p> <div class="question"> <span class="question">Was ist damit gemeint, dass das One-Time-Pad-Chiffre verwundbar ist?</span> <div class="answer"> Ein Angreifer kann die Klartextnachricht &auml;ndern. Wenn er wei&szlig; (oder zumindest ahnt) was der Klartext ist, kann er daf&uuml;r sorgen, dass ein Klartext gleicher L&auml;nge seiner Wahl bei der Entschl&uuml;sselung herauskommt. </div> <p></div></p> <div class="question"> <span class="question">Nennen Sie Verfahren, die IND-CPA-sicher sind.</span> <div class="answer"> Eine Blockciffre im CBC-Modus </div> <p></div></p> <div class="question"> <span class="question">Nennen Sie Verfahren, die EUF-CMA-sicher sind.</span> <div class="answer"> Sei PRF: `$\{0,1\}^k \times \{0,1\}^k \rightarrow \{0,1\}^k$` eine PRF und `$H:\{0,1\}^* \rightarrow \{0,1\}^k$` eine kollisionsresistente Hashfunktion. Dann ist der durch `$Sig(K, M) = PRF(K, H(M))$` gegebene MAC EUF-CMA-sicher. </div> <p></div></p> <h2>Diverses</h2> <h3>TLS Handshake</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/04/tls-handshake.jpg"><img src="../images/2013/04/tls-handshake.jpg" alt="" width="512" height="449" class="size-full wp-image-74511"/></a><p class="wp-caption-text"></p></div> <h3>Change Cipher Spec Drop</h3> <p>Ein Angriff auf verschl&uuml;sselte Verbindungen: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/04/change-cipher-spec-drop.jpg"><img src="../images/2013/04/change-cipher-spec-drop.jpg" alt="" width="512" height="275" class="size-full wp-image-74501"/></a><p class="wp-caption-text"></p></div></p> <h2>Material</h2> <ul> <li><a href="http://www.iks.kit.edu/index.php?id=sic-sose13">Vorlesungswebsite</a></li> <li>Mein <a href="https://ankiweb.net/shared/info/4056558772">Anki-Deck</a></li> <li><a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_vorlaeufiges_Skript.pdf">Skript</a></li> <li>StackExchange: <ul> <li><a href="http://crypto.stackexchange.com/q/5646/7248">What are the differences between a digital signature, a MAC and a hash?</a></li> </ul> </li> </ul> <p>In der Fachschaft gibt es folgende Altklausuren: <ol> <li>Hauptklausur SS 2012</li> <li>Nachklausur SS 2011</li> <li>Hauptklausur SS 2011</li> <li>Nachklausur SS 2010</li> <li>Hauptklausur SS 2010</li> </ol></p> <h2>Aufbau der Klausur</h2> <p>Bisher gab es meist 6 Aufgaben mit jeweils 10 Punkten:</p> <ol> <li>Blockchiffren und <a href="http://commons.wikimedia.org/wiki/User:MartinThoma#Betriebsmodi">Betriebsmodi</a></li> <li>ElGamal / <a href="http://de.wikipedia.org/wiki/Diffie-Hellman-Schl%C3%BCsselaustausch">Diffie-Hellman-Schl&uuml;sselaustausch</a></li> <li>RSA; RSA-OAEP</li> <li>Kerberos / Feistel / (H)MAC</li> <li>Bell-LaPadula / Chinese Wall</li> <li>Multiple Choice</li> </ol> <h2>&Uuml;bungsbetrieb</h2> <p>Es gibt &Uuml;bungsbl&auml;tter auf der Vorlesungswebsite, aber keinen &Uuml;bungsschein, keine Abgaben und keine Bonuspunkte.</p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Freitag, den 26. Juli 2013 von 14:00 bis 15:00 Uhr (Klausur dauerte eine Stunde) <strong>Ort</strong>: seit 24.07.2013 auf der <a href="http://www.iks.kit.edu/sic-sose13">Vorlesungswebsite</a> (ich bin im H.S.a.F) <strong>Punkte</strong>: 60 <strong>Bestehensgrenze</strong>: 20 <strong>&Uuml;bungsschein</strong>: Nein <strong>Bonuspunkte</strong>: Nein</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Sind noch nicht drau&szlig;en (Stand: 30.07.2013)</p> <p>Sind nun drau&szlig;en (Stand: 09.08.2013): <a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_HK-Ergebnis.pdf">Vorl&auml;ufige Ergebnisse als PDF</a></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/04/ergebnis-sicherheit-300x227.png"><img src="../images/2013/04/ergebnis-sicherheit-300x227.png" alt="" width="300" height="227" class="size-medium wp-image-75851"/></a><p class="wp-caption-text"></p></div> Semantische Sicherheit http://martin-thoma.com/semantische-sicherheit Sun, 28 Apr 2013 13:06:53 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/semantische-sicherheit <p>In der <a href="http://www.iks.kit.edu/fileadmin/User/Lectures/Sicherheit/SoSe13/Sicherheit_VL03.pdf">Vorlesung vom 25.04.2013</a> hat Prof. Hofheinz gesagt, dass man semantische Sicherheit praktisch nicht beweisen kann, da man zuerst <code>$\mathcal{P} \neq \mathcal{NP}$</code> beweisen m&uuml;sste. Warum das so ist, versuche ich nun zu erl&auml;utern.</p> <h2>Einwegfunktionen und `$\mathcal{P} \neq \mathcal{NP}$`</h2> <div class="definition"> Sei `$f:X \rightarrow Y$` eine Funktion. `$f$` hei&szlig;t eine Einwegfunktion, genau dann wenn f&uuml;r alle `$x \in X$` gilt: <ul> <li>`$y := f(x)$` kann in Polynomialzeit berechnet werden</li> <li>F&uuml;r die Berechnung eines Urbildes `$x$` aus `$y$` existiert kein randomisierter Algorithmus, der in Polynomialzeit l&auml;uft.</li> </ul> </div> <p>Es gilt: Wenn eine Einwegfunktion <code>$f$</code> existiert, dann gilt <code>$\mathcal{P} \neq \mathcal{NP}$</code>.</p> <p>Warum?</p> <p>Nun, angenommen es gibt eine Einwegfunktion <code>$f$</code>. Dann sei die formale Sprache <code>$L_f$</code> definiert durch:</p> <p><code>$L_f := \{(\bar x, y) | \exists x: \bar x \text{ ist Pr&amp;auml;fix von } x \text{ und } y = f(x)\}$</code></p> <p>Es gilt: <code>$L_f \notin \mathcal{P}$</code>, da f&uuml;r ein gegebenes <code>$y$</code> das zugeh&ouml;rige <code>$x$</code> in polynomialzeit bestimmt werden k&ouml;nnte (wie will man sonst pr&uuml;fen, ob <code>$\bar x$</code> ein Pr&auml;fix von <code>$x$</code> ist?)</p> <p>Falls jemanden diese Begr&uuml;ndung nicht ausreicht ist hier noch ein Beweis von Prof. Hofheinz (Danke!)</p> <p><strong>Beh.:</strong> <code>$L_f \notin \mathcal{P}$</code> <strong>Bew.:</strong> durch Widerspruch <u>Annahme.:</u> <code>$L_f \in P$</code> <code>$\Rightarrow$</code> Es existiert ein Polyzeit-Algorithmus <code>$\mathcal{A}$</code> f&uuml;r <code>$L_f$</code>, der bei Eingabe <code>$(\bar x, y)$</code> entscheidet, ob ein <code>$x$</code> mit <code>$f(x)=y$</code> und Pr&auml;fix <code>$\bar x$</code> existiert oder nicht. Dann k&ouml;nnen wir einen Algorithmus <code>$\mathcal{B}$</code> aus <code>$\mathcal{A}$</code> bauen, der <code>$f$</code> invertiert.</p> <p>Gegeben <code>$y$</code> verf&auml;hrt <code>$\mathcal{B}$</code> wie folgt: <code>$\mathcal{B}$</code> ruft <code>$\mathcal{A}(0,y)$</code> auf und erf&auml;hrt so, ob ein Urbild <code>$x$</code> von <code>$y$</code> mit Anfangsbit <code>$0$</code> existiert. Wenn ja, ruft <code>$\mathcal{B}$</code> den Algorithmus <code>$\mathcal{A}(00,y)$</code> auf, wenn nein ruft <code>$\mathcal{B}$</code> den Algorithmus <code>$\mathcal{A}(10,y)$</code> auf usw.</p> <p>So wird ein Urbild <code>$x$</code> bitweise bestimmt. Ein solches <code>$\mathcal{B}$</code> findet also effizient Urbilder, im Widerspruch zur Einwegannahme &uuml;ber <code>$f \blacksquare$</code></p> <p>Aber: Wenn das <code>$x$</code> gegeben ist, dann ist es einfach zu zeigen, dass <code>$y= f(x)$</code> gilt und damit auch, ob <code>$\bar x$</code> ein Pr&auml;fix von <code>$x$</code> ist. Damit ist <code>$L_f \in \mathcal{NP}$</code>.</p> <p>Damit gilt: <code>$L_f \in \mathcal{NP} \setminus \mathcal{P}$</code>. Wenn aber <code>$\mathcal{NP} \setminus \mathcal{P} \neq \emptyset$</code>, dann gilt insbesondere <code>$\mathcal{P} \neq \mathcal{NP}$</code>.</p> <p>An dieser Stelle sollte man also einsehen, dass eine Einwegfunktion nach obiger Definition nur existieren kann, wenn <code>$\mathcal{P} \neq \mathcal{NP}$</code> gilt.</p> <h2>Semantische Sicherheit</h2> <p><a href="http://de.wikipedia.org/wiki/Sicherheitseigenschaften_kryptografischer_Verfahren#Semantische_Sicherheit">Wikipedia</a> gibt folgende Beschreibung von semantischer Sicherheit:</p> <blockquote>Ein Verschl&uuml;sselungsverfahren ist semantisch sicher, wenn jeder Angreifer jede Information, die er aus einem Chiffrat &uuml;ber die Nachricht ableiten kann, bereits dann ableiten kann, wenn er nur die L&auml;nge des Chiffrats kennt. Ein Chiffrat verr&auml;t also nichts &uuml;ber eine Nachricht als ihre L&auml;nge.</blockquote> <p>Herr Prof. Hofheinz hat folgende informelle Definition von Semantischer Sicherheit in der Vorlesung gegeben:</p> <div class="definition"> Ein symmetrisches Verschl&uuml;sselungsverfahren ist semantisch sicher, wenn es f&uuml;r jede `$M$`-Verteilung, jede Funktion `$f$` und jeden PPT-Algorithmus `$\mathcal{A}$` einen PPT-Algorithmus `$\mathcal{B}$` gibt, so dass `$Pr \left [\mathcal{A}^{\text{Enc}(K, \cdot)}(\text{Enc}(K, M)) = f(M) \right ] - Pr [\mathcal{B}(\varepsilon) = f(M)]$` vernachl&auml;ssigbar (als Funktion im Sicherheitsparameter `$K$`) ist. </div> <p>Hier ist <ul> <li><code>$M$</code> eine Nachricht (Message),</li> <li><code>$\text{Enc(K, M)}$</code> die Verschl&uuml;sselung einer konkreten Nachricht <code>$M$</code> mit dem Schl&uuml;ssel <code>$K$</code>,</li> <li><code>$\varepsilon$</code> eine triviale Information (ich glaube das ist z.B. die L&auml;nge des Ciphertextes) und</li> <li><code>$f$</code> extrahiert beliebige Informationen aus dem Plaintext</li> </ul></p> <p>Die erste Wahrscheinlichkeit bezeichnet die M&ouml;glichkeit, aus dem Ciphertext Informationen der Art <code>$f$</code> &uuml;ber den Plaintext <code>$M$</code> zu erhalten. Die zweite Wahrscheinlichkeit bezeichnet die M&ouml;glichkeit &bdquo;aus dem Nichts&ldquo; Informationen &uuml;ber eine Nachricht zu erhalten. Damit will man triviale Informationen eliminieren. Insgesamt gibt es also die Wahrscheinlichkeit an, nicht-triviale Informationen aus einer Verschl&uuml;sselten Nachricht zu erhalten. Mit effizient ist vermutlich in Polynomialzeit gemeint.</p> <p>Wenn es nun mehrfach benutzbare semantisch sichere Verfahren gibt, dann kann man dieses Verfahren als Einwegfunktion nutzen. Wenn eine Einwegfunktion existiert, gilt <code>$\mathcal{P} \neq \mathcal{NP}$</code>. Also folgt:</p> <p>Wenn es nun mehrfach benutzbare semantisch sichere Verfahren existieren, gilt <code>$\mathcal{P} \neq \mathcal{NP}$</code>. Dies ist aber eines der <a href="http://de.wikipedia.org/wiki/Millennium-Probleme">Millennium-Probleme</a> und noch nicht gekl&auml;rt.</p> Google Code Jam – Round 1A 2013 http://martin-thoma.com/google-code-jam-round-1a-2013 Sat, 27 Apr 2013 05:15:17 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-round-1a-2013 <ul> <li>Problem A (<a href="https://code.google.com/codejam/contest/2418487/dashboard#s=p0">Bullseye</a>): <ul> <li>Small Set: 5856/6195 users (95%)</li> <li>Large Set: 1806/4795 users (38%)</li> </ul> <li>Problem B (<a href="https://code.google.com/codejam/contest/2418487/dashboard#s=p1">Manage your Energy</a>): <ul> <li>Small Set: 2323/3789 users (61%)</li> <li>Large Set: 456/1133 users (40%)</li> </ul> </li> <li>Problem C (<a href="https://code.google.com/codejam/contest/2418487/dashboard#s=p2">Good Luck</a>): <ul> <li>Small Set: 1366/1774 users (77%)</li> <li>Large Set: 31/605 users (5%)</li> </ul> </li> </ul> <p>More information might soon be on <a href="http://www.go-hero.net/jam/13/">go-hero.net</a>.</p> <p>I&#39;m too slow for Google Code Jam <em>sigh</em>. Nevertheless, here are my solutions:</p> <h2>Bullseye</h2> <h3>Small</h3> <p>[php] &lt;?</p> <p>function solve(<code>$r, $</code>t) { <code>$circles = 0; while($</code>t &gt;= 0) { <code>$circles++; $</code>t -= (<code>$r+1)*($</code>r+1)-<code>$r*$</code>r; <code>$r += 2; } return floor($</code>circles) - 1; }</p> <p><code>$fp = fopen ($</code>argv[1], &#39;r&#39;); <code>$testcases = fgets ($</code>fp); <code>$caseNr=0; while($</code>line = fgets (<code>$fp)) { $</code>caseNr++; <code>$a = explode(&#39; &#39;, $</code>line); <code>$r = $</code>a[0]; <code>$t = $</code>a[1]; echo &quot;Case #<code>$caseNr: &quot;.solve($</code>r, `$t).&quot;\n&quot;;</p> <p>} ?&gt; [/php]</p> <h3>Large</h3> <p><em>Argh</em> I&#39;ve copied the wrong equation from my pad to my computer </p> <p>You basically have to solve this: $<code>\begin{align} t - \sum_{i=0}^x ((r+1+2i)^2 - (r+2i)^2) &amp;\geq 0\\ \Leftrightarrow t - (x+1)(2x+2r+1) &amp;\geq 0 \\ \Leftrightarrow (-2)x^2 + (2r+3)x + (t-2r-1) &amp;\geq 0 \\ \Rightarrow x_{1,2} = 0 \Leftrightarrow x_{1,2} &amp;= \frac{1}{-4} \cdot (-(2r+3) \pm \sqrt{(2r+3)^2-4(-2)(t-2r-1)}) \\ &amp;= -\frac{1}{4} \cdot (-2r-3 \pm \sqrt{4r^2+12r+9+8(t-2r-1)})\\ &amp;= -\frac{1}{4} \cdot (-2r-3 \pm \sqrt{4r^2+12r+9+8t-16r-8})\\ &amp;= -\frac{1}{4} \cdot (-2r-3 \pm \sqrt{4r^2-4r+1+8t})\\ &amp;= \frac{1}{4} \cdot (2r+3 \pm \sqrt{(2r-1)^2+8t})\\ &amp;= \frac{1}{4} \cdot (2r+3 \pm \sqrt{(2r-1)^2+8t})\\ \end{align} </code>$</p> <p>I have to know that $<code>1 \leq r</code>$ and $<code>1 \geq x \in \mathbb{N}</code>$. So you have to round $`x<em>1, x</em>2$ to the nearest solution.</p> <p>Did you know that Python has (in numpy) a method to calculate roots of a quadratic equation? See <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html">numpy.roots</a> for reference.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">ceil</span><span class="p">,</span> <span class="n">roots</span> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">t</span><span class="o">-</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">def</span> <span class="nf">solveFast</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span> <span class="n">myRoots</span> <span class="o">=</span> <span class="n">roots</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="o">+</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="o">*</span><span class="n">r</span><span class="o">+</span><span class="mi">1</span><span class="o">-</span><span class="n">t</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span> <span class="k">if</span> <span class="n">myRoots</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">answer</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">myRoots</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">while</span> <span class="ow">not</span> <span class="n">check</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">answer</span><span class="p">):</span> <span class="n">answer</span> <span class="o">-=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">answer</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="n">r</span><span class="p">,</span> <span class="n">t</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solveFast</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">t</span><span class="p">)))</span> </code></pre></div> <h2>Good Luck</h2> <p>This one solves at least the first test case, but not the second one.</p> <p>I love <a href="http://docs.python.org/2/library/itertools.html">itertools</a> :-)</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">factorial</span> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">combinations_with_replacement</span> <span class="kn">import</span> <span class="nn">pprint</span> <span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">deepcopy</span> <span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="n">integers</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">integers</span><span class="p">:</span> <span class="n">s</span> <span class="o">*=</span> <span class="n">p</span> <span class="k">return</span> <span class="n">s</span> <span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">block</span><span class="p">):</span> <span class="n">newCandidates</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">candidates</span><span class="p">)</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">set</span><span class="p">(</span><span class="n">block</span><span class="p">):</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">block</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="o">-</span> <span class="n">newCandidates</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">diff</span><span class="p">):</span> <span class="n">newCandidates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="k">return</span> <span class="n">newCandidates</span> <span class="k">def</span> <span class="nf">canBeIn</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">N</span><span class="p">):</span> <span class="n">merged</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">merged</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">N</span><span class="p">)</span> <span class="sd">&quot;&quot;&quot; </span> <span class="sd"> N: number of numbers in total that got randomly picked</span> <span class="sd"> M: A_i in [2, M]</span> <span class="sd">&quot;&quot;&quot;</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">products</span><span class="p">,</span> <span class="n">productToBuildungs</span><span class="p">):</span> <span class="n">candidates</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># Is there a simple answer?</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">products</span><span class="p">:</span> <span class="k">if</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">p</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">candidates</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">p</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">candidates</span><span class="p">)</span> <span class="o">==</span> <span class="n">N</span><span class="p">:</span> <span class="k">return</span> <span class="n">candidates</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">products</span><span class="p">:</span> <span class="n">pos</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">b</span><span class="p">:</span> <span class="n">canBeIn</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">p</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">candidates</span> <span class="o">=</span> <span class="n">merge</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">candidates</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">:</span> <span class="n">candidates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="k">return</span> <span class="n">candidates</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">:&quot;</span> <span class="o">%</span> <span class="n">caseNr</span><span class="p">)</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="n">arr</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">R</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">N</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="n">M</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="n">K</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="c"># which products can I get</span> <span class="n">productToBuildungs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">product</span> <span class="ow">in</span> <span class="n">combinations_with_replacement</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">M</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span><span class="n">r</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="n">mul</span><span class="p">(</span><span class="n">product</span><span class="p">)</span> <span class="k">if</span> <span class="n">s</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">productToBuildungs</span><span class="p">:</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">)]]</span> <span class="k">else</span><span class="p">:</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">s</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">productToBuildungs</span><span class="p">[</span><span class="n">s</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">))</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">R</span><span class="p">):</span> <span class="n">products</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">]</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">solve</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">products</span><span class="p">,</span> <span class="n">productToBuildungs</span><span class="p">)))))</span> </code></pre></div> Google Code Jam Templates http://martin-thoma.com/google-code-jam-templates Fri, 26 Apr 2013 09:17:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-templates <p>Here are some templates that are a good start for Google Code Jam.</p> <h2>C++</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* number of test cases */</span> <span class="kt">unsigned</span> <span class="kt">short</span> <span class="kt">int</span> <span class="n">testcases</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">t</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">t</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//loops for each case</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">zeile</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">zeile</span><span class="o">&lt;</span><span class="mi">4</span><span class="p">;</span> <span class="n">zeile</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">spalte</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">spalte</span><span class="o">&lt;</span><span class="mi">4</span><span class="p">;</span> <span class="n">spalte</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">game</span><span class="p">[</span><span class="n">zeile</span><span class="p">][</span><span class="n">spalte</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Case #&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">solve</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Compile</p> <div class="highlight"><pre><code class="bash">g++ A.cpp </code></pre></div> <p>Execute</p> <div class="highlight"><pre><code class="bash">./a.out &lt; A-small-practice.in &gt; result.txt </code></pre></div> <h2>Python</h2> <ul> <li>Input: <a href="http://docs.python.org/2/library/functions.html#input">input</a>, <a href="http://docs.python.org/2/library/functions.html#raw_input">raw_input()</a></li> <li>String parsing: <a href="http://docs.python.org/2/library/stdtypes.html#str.strip">strip()</a>, <a href="http://docs.python.org/2/library/stdtypes.html#str.split">split()</a></li> </ul> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">testcases</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">cipher</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="p">,</span> <span class="n">solve</span><span class="p">(</span><span class="n">cipher</span><span class="p">)))</span> </code></pre></div> <p>Execute</p> <div class="highlight"><pre><code class="bash">python A.py &lt; A-small-practice.in &gt; result.txt </code></pre></div> <h2>Java</h2> <p>This is an ajusted version of mystics solution for &quot;Dancing with Googlers&quot;. You might want to take a look at <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html">Scanner</a> and <a href="http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html">PrintWriter</a>.</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.*</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">DancingWithGoogle</span> <span class="o">{</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">PROBLEM_NAME</span> <span class="o">=</span> <span class="s">&quot;dance&quot;</span><span class="o">;</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">WORK_DIR</span> <span class="o">=</span> <span class="s">&quot;/home/moose/Desktop/&quot;</span> <span class="o">+</span> <span class="n">PROBLEM_NAME</span> <span class="o">+</span> <span class="s">&quot;/&quot;</span><span class="o">;</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">INPUT_FILE_NAME</span> <span class="o">=</span> <span class="s">&quot;input.txt&quot;</span><span class="o">;</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">OUTPUT_FILE_NAME</span> <span class="o">=</span> <span class="s">&quot;output.txt&quot;</span><span class="o">;</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">maxBest</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="mi">31</span><span class="o">][</span><span class="mi">2</span><span class="o">];</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preprocess</span><span class="o">()</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">30</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="n">Arrays</span><span class="o">.</span><span class="na">fill</span><span class="o">(</span><span class="n">maxBest</span><span class="o">[</span><span class="n">i</span><span class="o">],</span> <span class="o">-</span><span class="mi">1</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">A</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">A</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="o">;</span> <span class="n">A</span><span class="o">++)</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">B</span> <span class="o">=</span> <span class="n">A</span><span class="o">;</span> <span class="n">B</span> <span class="o">&lt;=</span> <span class="mi">10</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">B</span> <span class="o">&lt;=</span> <span class="n">A</span> <span class="o">+</span> <span class="mi">2</span><span class="o">;</span> <span class="n">B</span><span class="o">++)</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">C</span> <span class="o">=</span> <span class="n">B</span><span class="o">;</span> <span class="n">C</span> <span class="o">&lt;=</span> <span class="mi">10</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">C</span> <span class="o">&lt;=</span> <span class="n">A</span> <span class="o">+</span> <span class="mi">2</span><span class="o">;</span> <span class="n">C</span><span class="o">++)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">tot</span> <span class="o">=</span> <span class="n">A</span> <span class="o">+</span> <span class="n">B</span> <span class="o">+</span> <span class="n">C</span><span class="o">,</span> <span class="n">sur</span> <span class="o">=</span> <span class="o">(</span><span class="n">C</span> <span class="o">-</span> <span class="n">A</span> <span class="o">==</span> <span class="mi">2</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="o">);</span> <span class="n">maxBest</span><span class="o">[</span><span class="n">tot</span><span class="o">][</span><span class="n">sur</span><span class="o">]</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">maxBest</span><span class="o">[</span><span class="n">tot</span><span class="o">][</span><span class="n">sur</span><span class="o">],</span> <span class="n">C</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="kt">void</span> <span class="nf">solve</span><span class="o">(</span><span class="n">Scanner</span> <span class="n">sc</span><span class="o">,</span> <span class="n">PrintWriter</span> <span class="n">pw</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">N</span> <span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextInt</span><span class="o">();</span> <span class="kt">int</span> <span class="n">S</span> <span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextInt</span><span class="o">();</span> <span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextInt</span><span class="o">();</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">tot</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">N</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="n">tot</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextInt</span><span class="o">();</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">dp</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="o">][</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">N</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="n">Arrays</span><span class="o">.</span><span class="na">fill</span><span class="o">(</span><span class="n">dp</span><span class="o">[</span><span class="n">i</span><span class="o">],</span> <span class="o">-</span><span class="mi">100000</span><span class="o">);</span> <span class="n">dp</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">pos</span> <span class="o">&lt;</span> <span class="n">N</span><span class="o">;</span> <span class="n">pos</span><span class="o">++)</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">sur</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">sur</span> <span class="o">&lt;=</span> <span class="n">pos</span><span class="o">;</span> <span class="n">sur</span><span class="o">++)</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">nSur</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">nSur</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">;</span> <span class="n">nSur</span><span class="o">++)</span> <span class="k">if</span> <span class="o">(</span><span class="n">maxBest</span><span class="o">[</span><span class="n">tot</span><span class="o">[</span><span class="n">pos</span><span class="o">]][</span><span class="n">nSur</span><span class="o">]</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="o">)</span> <span class="n">dp</span><span class="o">[</span><span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="o">][</span><span class="n">sur</span> <span class="o">+</span> <span class="n">nSur</span><span class="o">]</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="na">max</span><span class="o">(</span><span class="n">dp</span><span class="o">[</span><span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="o">][</span><span class="n">sur</span> <span class="o">+</span> <span class="n">nSur</span><span class="o">],</span> <span class="n">dp</span><span class="o">[</span><span class="n">pos</span><span class="o">][</span><span class="n">sur</span><span class="o">]</span> <span class="o">+</span> <span class="o">(</span><span class="n">maxBest</span><span class="o">[</span><span class="n">tot</span><span class="o">[</span><span class="n">pos</span><span class="o">]][</span><span class="n">nSur</span><span class="o">]</span> <span class="o">&gt;=</span> <span class="n">p</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="o">));</span> <span class="n">pw</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">dp</span><span class="o">[</span><span class="n">N</span><span class="o">][</span><span class="n">S</span><span class="o">]);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span> <span class="n">preprocess</span><span class="o">();</span> <span class="n">Scanner</span> <span class="n">sc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Scanner</span><span class="o">(</span><span class="k">new</span> <span class="n">FileReader</span><span class="o">(</span><span class="n">WORK_DIR</span> <span class="o">+</span> <span class="n">INPUT_FILE_NAME</span><span class="o">));</span> <span class="n">PrintWriter</span> <span class="n">pw</span> <span class="o">=</span> <span class="k">new</span> <span class="n">PrintWriter</span><span class="o">(</span><span class="k">new</span> <span class="n">FileWriter</span><span class="o">(</span><span class="n">WORK_DIR</span> <span class="o">+</span> <span class="n">OUTPUT_FILE_NAME</span><span class="o">));</span> <span class="kt">int</span> <span class="n">caseCnt</span> <span class="o">=</span> <span class="n">sc</span><span class="o">.</span><span class="na">nextInt</span><span class="o">();</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">caseNum</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">caseNum</span> <span class="o">&lt;</span> <span class="n">caseCnt</span><span class="o">;</span> <span class="n">caseNum</span><span class="o">++)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Processing test case &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">caseNum</span> <span class="o">+</span> <span class="mi">1</span><span class="o">));</span> <span class="n">pw</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">&quot;Case #&quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">caseNum</span> <span class="o">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;: &quot;</span><span class="o">);</span> <span class="k">new</span> <span class="nf">DancingWithGoogle</span><span class="o">().</span><span class="na">solve</span><span class="o">(</span><span class="n">sc</span><span class="o">,</span> <span class="n">pw</span><span class="o">);</span> <span class="o">}</span> <span class="n">pw</span><span class="o">.</span><span class="na">flush</span><span class="o">();</span> <span class="n">pw</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> <span class="n">sc</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Adjust the path and execute it within Eclipse.</p> <h2>PHP</h2> <p>Input / output: <ul> <li><code>$fp = &lt;a href=&quot;http://php.net/manual/en/function.fopen.php&quot;&gt;fopen&lt;/a&gt; (&lt;a href=&quot;http://php.net/manual/en/reserved.variables.argv.php&quot;&gt;$</code>argv[1]</a>, &#39;r&#39;): Open file pointer to file in first command line argument</li> <li>string <a href="http://php.net/manual/en/function.fgets.php">fgets</a> ($fp): Read one line</li> </ul></p> <p>Execute:</p> <div class="highlight"><pre><code class="bash">php A.php input.txt &gt; output.txt </code></pre></div> <h2>JavaScript</h2> <p>Did you know that you can also solve those tasks with JavaScript? I&#39;ve explained <a href="http://stackoverflow.com/a/16242806/562769">how to install v8</a>.</p> <p>Here is a <a href="http://www.go-hero.net/jam/13/name/aditsu">solution from aditsu</a>:</p> <div class="highlight"><pre><code class="javascript"><span class="c1">// run with v8: d8 file.js &lt; file.in</span> <span class="kd">var</span> <span class="nx">m</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">dot</span> <span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">x0</span><span class="p">,</span> <span class="nx">y0</span><span class="p">,</span> <span class="nx">dx</span><span class="p">,</span> <span class="nx">dy</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span> <span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="mi">0</span> <span class="kd">var</span> <span class="nx">t</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span> <span class="k">switch</span> <span class="p">(</span><span class="nx">m</span><span class="p">[</span><span class="nx">x0</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">*</span> <span class="nx">dx</span><span class="p">][</span><span class="nx">y0</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">*</span> <span class="nx">dy</span><span class="p">])</span> <span class="p">{</span> <span class="k">case</span> <span class="s1">&#39;X&#39;</span><span class="o">:</span><span class="nx">x</span><span class="o">++</span><span class="p">;</span><span class="k">break</span> <span class="k">case</span> <span class="s1">&#39;O&#39;</span><span class="o">:</span><span class="nx">o</span><span class="o">++</span><span class="p">;</span><span class="k">break</span> <span class="k">case</span> <span class="s1">&#39;T&#39;</span><span class="o">:</span><span class="nx">t</span><span class="o">++</span><span class="p">;</span><span class="k">break</span> <span class="k">case</span> <span class="s1">&#39;.&#39;</span><span class="o">:</span><span class="nx">dot</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="k">break</span> <span class="p">}</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">t</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="nx">res</span> <span class="o">=</span> <span class="s1">&#39;X&#39;</span> <span class="k">if</span> <span class="p">(</span><span class="nx">o</span> <span class="o">+</span> <span class="nx">t</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="nx">res</span> <span class="o">=</span> <span class="s1">&#39;O&#39;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">t</span> <span class="o">=</span> <span class="nx">readline</span><span class="p">()</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="nx">t</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span> <span class="nx">m</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="nx">j</span><span class="p">)</span> <span class="p">{</span> <span class="nx">m</span><span class="p">[</span><span class="nx">j</span><span class="p">]</span> <span class="o">=</span> <span class="nx">readline</span><span class="p">()</span> <span class="p">}</span> <span class="nx">readline</span><span class="p">()</span> <span class="nx">res</span> <span class="o">=</span> <span class="kc">null</span> <span class="nx">dot</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="nx">j</span><span class="p">)</span> <span class="p">{</span> <span class="nx">check</span><span class="p">(</span><span class="nx">j</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="nx">check</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">j</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="p">}</span> <span class="nx">check</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="nx">check</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">res</span> <span class="o">?</span> <span class="nx">res</span> <span class="o">+</span> <span class="s1">&#39; won&#39;</span> <span class="o">:</span> <span class="nx">dot</span> <span class="o">?</span> <span class="s1">&#39;Game has not completed&#39;</span> <span class="o">:</span> <span class="s1">&#39;Draw&#39;</span> <span class="nx">print</span><span class="p">(</span><span class="s1">&#39;Case #&#39;</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">+</span> <span class="s1">&#39;: &#39;</span> <span class="o">+</span> <span class="nx">res</span><span class="p">)</span> <span class="p">}</span> </code></pre></div> Triangle area http://martin-thoma.com/triangle-area Thu, 25 Apr 2013 08:13:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/triangle-area <p>I&#39;ve just seen the following image on spikedmath.com:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/04/549-simple-area-quizz.png"><img src="../images/2013/04/549-simple-area-quizz.png" alt="" width="512" height="109" class="size-full wp-image-64221"/></a><p class="wp-caption-text"></p></div> <p>The second answers seem to be obviously the correct ones, right? Wrong.</p> <p>According to <a href="http://en.wikipedia.org/wiki/Heron%27s_formula">Heron&#39;s formula</a> you can calculate a triangles area like this:</p> <p>Let <code>$a, b, c$</code> be the side lengths of the triangle. <code>$s := \frac{a+b+c}{2}$</code> <code>$T = \sqrt{s \cdot (s-a) \cdot (s-b) \cdot (s-c)}$</code></p> <p>So the area of the first triangle is <code>$s_1 := \frac{16}{2} = 8$</code> <code>$T_1 := \sqrt{8 \cdot (8-5) \cdot (8-5) \cdot (8-6)} = \sqrt{8 \cdot 3 \cdot 3 \cdot 2} = 3 \cdot 4 = 12$</code></p> <p>The area of the second one is <code>$s_1 := \frac{18}{2} = 9$</code> <code>$T_1 := \sqrt{9 \cdot (9-5) \cdot (9-5) \cdot (9-8)} = \sqrt{9 \cdot 4 \cdot 4 \cdot 1} = 3 \cdot 4 = 12$</code></p> <p>Both triangles have the same area!</p> <p>When you draw it, it looks like this:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/04/triangle-heron-tricky1.png"><img src="../images/2013/04/triangle-heron-tricky1.png" alt="" width="512" height="423" class="size-full wp-image-64341"/></a><p class="wp-caption-text"></p></div> Rechnernetze-Klausur http://martin-thoma.com/rechnernetze-klausur Thu, 25 Apr 2013 07:32:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/rechnernetze-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Einf&uuml;hrung in Rechnernetze&ldquo; des Moduls &bdquo;Kommunikation und Datenhaltung&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn <a href="http://pcs.tm.kit.edu/21_beigl.php">Prof. Dr. Beigl</a> im Sommersemester 2013 geh&ouml;rt.</div> <h2>Behandelter Stoff</h2> <table> <tr> <td>16.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Einleitung</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Folien/01_Einfuehrung_Rechnernetze.pdf">Kapitel 1</a></td> </tr> <tr> <td>24.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Email, <span class="hint" title="hochgradig gecachetes hirarchisches Datenbanksystem">DNS</span>, dig, nslookup, Peer-to-Peer-Netzwerke, Bootstrapping-Problem, ISO-/OSI-Schichtenmodell, <span class="hint" title="Service Access Points">SAPs</span>; Dienstgeber/-bringer, -funktionalit&auml;t, -nehmer, -primitiv, -leistung; Request, Indication, Response, Confirm; <span class="hint" title="Quality of Service">QoS</span></td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Folien/02_Architekturen_Rechnernetze.pdf">Kapitel 2</a>, Folie 18</td> </tr> <tr> <td>30.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;"><span class="hint" title="Service Data Unit">SDU</span>, <span class="hint" title="Protocoll Data Unit">PDU</span>, ISO / OSI-Architektur</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Folien/02_Architekturen_Rechnernetze.pdf">Kapitel 2</a> bis wohin?</td> </tr> <tr> <td>21.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;"><a href="http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung">CRC</a>, Generatorpolynome, Vorw&auml;rtsfehlerkorrektur, Sequenznummern, Quittung, Stop-and-wait</td> </tr> <tr> <td style="border-bottom:1px solid black;">?</td> </tr> <tr> <td>28.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Protokollmechanismen und Verbindungen: Stop-and-wait; Go-Back-N <abbr title="Automatic Repeat Request">ARQ</abbr>, Flusskontrolle (Open Loop, Closed Loop); Kreditbasierte Flusskontrolle</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Folien/04_Protokollmechanismen.pdf#page=36">Kapitel 4.5</a> - 4.8</td> </tr> <tr> <td>04.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">?</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Folien/05_HDLC.pdf">Kapitel 5</a></td> </tr> <tr> <td>12.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">&Uuml;bungsblatt 2: <abbr title="Automatic Repeat Request">ARQ</abbr>: Best&auml;tigter Dienst (JA), Zuverl&auml;ssiger Dienst (JA, wenn...); Stop-and-Wait;</td> </tr> <tr> <td style="border-bottom:1px solid black;">?</td> </tr> <tr> <td>18.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Paketvermittlung</td> </tr> <tr> <td style="border-bottom:1px solid black;">7.2.2</td> </tr> <tr> <td>25.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Broadcast-Routing: Dateneinheit wird f&uuml;r jedes System erstellt; Hot-Potato; Potential des Missbrauchs (&rarr; <a href="https://www.youtube.com/watch?v=AOEQ9GteWbg">The Internet could crash. We need a Plan B.</a>); Outlaw-detection; Distanz-Vector-Routing; Link-State-Routing</td> </tr> <tr> <td style="border-bottom:1px solid black;">7-44</td> </tr> <tr> <td>02.07.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">IPv4 (Class A/B/C/D/E-Netze); <abbr title="Classless Inter-Domain Routing">CIDR</abbr>; Zuteilung von Adressen (<abbr title="Dynamic Host Configuration Protocol">DHCP</abbr>); Subnetze und Subnetz-Maskierung</td> </tr> <tr> <td style="border-bottom:1px solid black;">7-44</td> </tr> </table> <p>Falls hier was fehlt, k&ouml;nnt ihr mich gerne in den Kommentaren oder per Mail (info@martin-thoma.de) darauf aufmerksam machen. Ich bin ja mal gespannt, ob ich das bis zum Ende aktuell halte.</p> <h3>&Uuml;bersicht &uuml;ber Dienstprimitive</h3> <table> <tr> <th>Name</th> <th>Dienstleistung</th> <th>Grundtypen</th> <th>Parameter</th> </tr> <tr> <td>Physical (Ph)</td> <td>Connect (Con)</td> <td>Request (Req)</td> <td colspan="7">Abh&auml;ngig vom Dienst</td> </tr> <tr> <td>Data Link (DL)</td> <td>Data (Dat)</td> <td>Indication (Ind)</td> </tr> <tr> <td>Network (N)</td> <td>Release (Rel)</td> <td>Response (Rsp)</td> </tr> <tr> <td>Transport (T)</td> <td>Abort (Abo)</td> <td>Confirmation (Cnf)</td> </tr> <tr> <td>HTTP</td> <td>Provider Abort (PAbo)</td> <td>&nbsp;</td> </tr> <tr> <td>FTP</td> <td>Disconnect (Dis)</td> <td>&nbsp;</td> </tr> <tr> <td>...</td> <td>...</td> <td>&nbsp;</td> </tr> </table> <h2>Fragen</h2> <div class="question"> <span class="question">Welche Qualit&auml;tsparameter sind f&uuml;r Rechnernetze denkbar?</span> <div class="answer"> <ul> <li>Angemessenheit</li> <li>Technische Leistung (Antwortzeit, Datenrate)</li> <li>Zuverl&auml;ssigkeit</li> <li>Sicherheit</li> <li>Kosten</li> </ul> </div> <p></div></p> <h2>Material</h2> <ul> <li><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Start/homepage.aspx">Vorlesungswebsite</a></li> <li><a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Lists/Forum/AllItems.aspx">Forum</a></li> <li><a href="https://ankiweb.net/shared/info/1739663871">Mein Anki-Deck</a></li> <li>Ein <a href="http://www.youtube.com/watch?v=0apqZ4jsGmI">Video &uuml;ber CRC</a></li> <li>Der Wikipedia-Artikel <a href="http://de.wikipedia.org/wiki/Routing">Routing</a> beinhaltet viele wichtige Informationen.</li> <li><a href="http://packetcrafter.wordpress.com/2011/02/13/tcp-flags-hackers-playground/">TCP flags: Hackers Playground</a></li> </ul> <h2>Aufbau der Klausur</h2> <p>H&auml;ufige Aufgabenstellungen sind: <ul> <li>Berechnen einer Subnetzmaske bzw. ob eine IP-Adresse in einem gegebenem Subnetz enthalten ist</li> <li>CRC berechnen / &uuml;berpr&uuml;fen ob CRC korrekt ist</li> <li>Distanz-Vektor Algorithmus (Bellman-Ford) durchgehen</li> <li>Protokollablauf durchspielen</li> </ul></p> <h2>&Uuml;bungsbetrieb</h2> <p>&Uuml;bungsbl&auml;tter sind <a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Vorlesungsunterlagen/Forms/AllItems.aspx?RootFolder=%2fsites%2fvab%2f0x2E18BE2A290A424EB98916CA7A6FF3FD%2fVorlesungsunterlagen%2fUebung&FolderCTID=&View=%7bF9CB46E3-13F6-4910-9A2E-BF24D999D119%7d">hier</a>.</p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Donnerstag, den 1. August 2013 von 14:00 bis 15:00 Uhr <strong>Ort</strong>: Seit 28.07.2013 <a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Start/homepage.aspx">online</a>: <table> <tr> <th>Ort</th> <th>von</th> <th>bis</th> </tr> <tr> <td>Audimax A (30.95, EG)</td> <td>Abdullah</td> <td>Galler</td> </tr> <tr> <td>Audimax B (30.95, EG)</td> <td>Gassenschmidt</td> <td>L&ouml;ffler</td> </tr> <tr> <td style="background-color:#cdcdcd">HSaF (50.35, EG)</td> <td>Loose</td> <td>Tobias</td> </tr> <tr> <td>Neue Chemie (30.46, EG)</td> <td>Traub</td> <td>Zumkeller</td> </tr> </table></p> <p><strong>Einsicht</strong>: 17.09.2013 <strong>Punkte</strong>: 30 <strong>Bestehensgrenze</strong>: 13 Punkte <strong>Notenskala</strong>: <table> <tr> <th>Note</th> <th>von</th> <th>bis</th> <th>Bereichsgr&ouml;&szlig;e</th> </tr> <tr> <th>1,0</th> <td>30,00</td> <td>26,50</td> <td>3,5</td> </tr> <tr> <th>1,3</th> <td>26,25</td> <td>25,00</td> <td>1,25</td> </tr> <tr> <th>1,7</th> <td>24,75</td> <td>23,50</td> <td>1,25</td> </tr> <tr> <th>2,0</th> <td>23,25</td> <td>22,00</td> <td>1,25</td> </tr> <tr> <th>2,3</th> <td>21,75</td> <td>20,50</td> <td>1,25</td> </tr> <tr> <th>2,7</th> <td>20,25</td> <td>19,00</td> <td>1,25</td> </tr> <tr> <th>3,0</th> <td>18,75</td> <td>17,50</td> <td>1,25</td> </tr> <tr> <th>3,3</th> <td>17,25</td> <td>16,00</td> <td>1,25</td> </tr> <tr> <th>3,7</th> <td>15,75</td> <td>14,50</td> <td>1,25</td> </tr> <tr> <th>4,0</th> <td>14,25</td> <td>13,00</td> <td>1,25</td> </tr> <tr> <th>5,0</th> <td>12,75</td> <td>00,00</td> <td>12,75</td> </tr> </table> <strong>&Uuml;bungsschein</strong>: Nein <strong>Bonuspunkte</strong>: Nein</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Sind nun <a href="https://studium.kit.edu/sites/vab/0x2E18BE2A290A424EB98916CA7A6FF3FD/Lists/Ankuendigungen/DispForm.aspx?ID=11">online</a>. Hier ist die Statistik: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/04/klausur-rechnernetze-2013-300x274.png"><img src="../images/2013/04/klausur-rechnernetze-2013-300x274.png" alt="" width="300" height="274" class="size-medium wp-image-76302"/></a><p class="wp-caption-text"></p></div></p> E.i.d. Algebra und Zahlentheorie-Klausur http://martin-thoma.com/eaz-klausur Tue, 23 Apr 2013 20:49:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/eaz-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Einf&uuml;hrung in die Algebra und Zahlentheorie&ldquo; (EAZ) am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn Prof. Dr. K&uuml;hnlein im Sommersemester 2013 geh&ouml;rt.</div> <h2>Behandelter Stoff</h2> <table> <tr> <td>16.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Teilbarkeit; ggT, kgV; Euklidischer Algorithmus</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=7">Kapitel 1.1</a></td> </tr> <tr> <td>17.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Primzahlen; Fundamentalsatz der Arithmetik; p-Adische Bewertung</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=11">Kapitel 1.2</a></td> </tr> <tr> <td>23.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Verteilung der Primzahlen; Sieb des Erasthostenes; Euler-Produkt; Dichtheitssatz</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=15">Kapitel 1.3</a></td> </tr> <tr> <td>24.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Magma, Monoid, Halbgruppe, Gruppe, Erzeugnis `$\langle X \rangle$`</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=15">Kapitel 2.2.1</a></td> </tr> <tr> <td>08.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Gruppenhomomorphismen</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=15">Kapitel 2.3.1 - 2.3.5</a></td> </tr> <tr> <td>15.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Faktorgruppen, Homomorphiesatz, Einfachheit, Freie Gruppen</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=40">Kapitel 2.4</a></td> </tr> <tr> <td>28.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Sylows&auml;tze; alternierende Gruppe `$A_n$`</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=51">Kapitel 2.6</a></td> </tr> <tr> <td>29.05.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Exkurs: Aufbau des Zahlensystems, Grothendieck-Konstruktion</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=56">Kapitel 2.7</a></td> </tr> <tr> <td>04.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Ringe, Ringhomomorphismen, Einheitengruppe, Nullteiler</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=61">Kapitel 3</a></td> </tr> <tr> <td>05.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Ideal; Chinesischer Restsatz</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/media/eazskript.pdf#page=65">Kapitel 3</a></td> </tr> </table> <h2>Material</h2> <ul> <li><a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/de">Vorlesungswebsite</a></li> <li><a href="https://ankiweb.net/shared/info/1756853157">Mein Anki-Deck</a> (digitale Karteikarten)</li> <li><a href="../mathematische-strukturen/" title="Mathematische Strukturen">&Uuml;berblick &uuml;ber mathematische Strukturen</a></li> <li>StackExchange <ul> <li>Das Urbild einer Gruppe unter einem Gruppenhomomorphismus ist eine Gruppe (<a href="http://math.stackexchange.com/q/476508/6876">Beweis</a>)</li> <li>Der Stabilisator einer Gruppenoperation ist eine Gruppe (<a href="../stabilizer-subgroup-subgroup/">Beweis</a>)</li> <li>Der Schnitt von Normalteilern ist wieder ein Normalteiler (<a href="../intersection-two-normal-subgroups-normal-subgroup/">Beweis</a>)</li> <li><a href="http://math.stackexchange.com/q/479039/6876">What does &ldquo;characteristic&rdquo; mean in mathematics?</a></li> <li>Wie man das Legendre-Symbol einfach berechnet: <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/Calculate-Legendre">Pseudocode</a></li> <li><a href="http://math.stackexchange.com/q/482158/6876">How many 3-Sylow groups are in a group of order 126?</a> - Durch die Frage (und die Kommentare) habe ich sehr viel gelernt!</li> <li><a href="http://math.stackexchange.com/q/483795/6876">How can I find decompositions in `$\mathbb{Z}[\sqrt{d}]$`?</a></li> <li><a href="http://math.stackexchange.com/q/473673/6876">Why is `$A_5$` a simple group?</a></li> <li><a href="http://math.stackexchange.com/q/476508/6876">Is the pre-image of a subgroup under a homomorphism a group?</a></li> </ul> </li> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents/eaz">Gedanken zu den Klausurhinweisen</a></li> <li>Eine sch&ouml;ne <a href="http://schickling.github.io/algorithms/">Skriptsammlung</a></li> </ul> <h2>Aufbau der Klausur</h2> <ul> <li>Eine Aufgabe, wo man das Legendre-Symbol ausrechnen muss</li> <li>Eine Aufgabe, wo man mit dem Satz von Lagrange wichtig ist</li> <li>Eine Aufgabe zu Normalteilern / Sylowgruppen</li> <li>Der Kleine Satz von Fermat / Homomorphiesatz</li> </ul> <h2>&Uuml;bungsbetrieb</h2> <ul> <li>Wo sind die &Uuml;bungsbl&auml;tter: <a href="http://www.math.kit.edu/iag3/lehre/einfalgzahl2013s/de">online</a></li> <li>Abgabeform: handschriftlich</li> <li>Abgabe: Donnerstags, K&auml;sten in Geb&auml;ude 1C</li> <li>R&uuml;cknahme: in den Tutorien</li> <li>Turnus: w&ouml;chentlich</li> <li>&Uuml;bungsschein verpflichtend: Nein</li> <li>Bonus durch &Uuml;bungsschein: Nein</li> </ul> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: 05.09.2013, 11:00 Uhr - 13:00 Uhr <strong>Zeit</strong>: 2 Stunden <strong>Ort</strong>: H&ouml;rsaal am Fasanengarten <strong>Punkte</strong>: 60 Punkte <strong>Bestehensgrenze</strong>: 22 Punkte <strong>&Uuml;bungsschein</strong>: Gibt es (sogar benotet) <strong>Bonuspunkte</strong>: Nein</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Seit dem 12.09.2013 drau&szlig;en:</p> <p>an den Informationstafeln bei den R&auml;umen 4A-21.1 und 4B-01</p> Datenbanksysteme-Klausur http://martin-thoma.com/datenbanksysteme-klausur Sat, 20 Apr 2013 11:35:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/datenbanksysteme-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Datenbanksysteme&ldquo; des Moduls &bdquo;Kommunikation und Datenhaltung&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei <a href="http://dbis.ipd.uni-karlsruhe.de/336.php">Herrn Prof. Dr. B&ouml;hm</a> im Sommersemester 2013 geh&ouml;rt.</div> <p>An diesem Artikel wird nat&uuml;rlich noch gearbeitet.</p> <h2>Behandelter Stoff</h2> <table> <tr> <td>15.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;"><span class="hint" title="Sie lagern Komplexit&auml;t aus: Keine redundante Speicherung von Daten, verhindern Inkonsistenzen">Warum Datenbanken toll sind</span>; <span class="hint" title="Atomarit&auml;t und Isolation">Transaktionseigenschaften</span>; Datenschutz; Datensicherheit; Relationsmodell; Integrit&auml;tsbedingungen; Schl&uuml;ssel; Fremdschl&uuml;ssel; SQL; View; <span class="hint" title="Zeile ausw&auml;hlen">Selektion</span>; <span class="hint" title="Spalte ausw&auml;hlen">Projektion</span>; <span class="hint" title="Beliebige Kombination der Operationen Verbund, Vereinigung, Differenz, Durchschnitt, Umbennenung, Projektion, Selektion">Query-Algebra</span>; <span class="hint" title="Zwei Selektionen k&ouml;nnen deutlich unterschiedlich gro&szlig;e Ergebnismengen haben. Werden sie hintereinander ausgef&uuml;hrt, empfiehlt es sich die st&auml;rker einschr&auml;nkende Selektion zuerst auszuf&uuml;hren.">Anfrage-Optimierer</span>; <span class="hint" title="Der Anwender sagt nur welches Ergebnis er will, nicht wie es ermittelt werden soll.">Anfragen sind deklarativ</span>; 3-Ebenen-Architektur; Trennung zwischen Schema und Instanz, <a href="https://de.wikipedia.org/wiki/Online_Analytical_Processing#12_Regeln_nach_Codd">9 Codd'sche Regeln</a></td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1272879/Kap1-Einleitung.pdf">Kapitel 1</a></td> </tr> <tr> <td>18.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Datentyp, Instanz, Polymorphes Typsystem, Typkonstruktoren, ... (TODO)</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1274077/Kap2-Datenmodellierung.pdf">Kapitel 2</a> - <a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1274086/Kap3-DDL.pdf">Kapitel 3</a>, Folie 32</td> </tr> <tr> <td>22.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">SQL (alter, drop, index, unique); Index; ER-Diagramm; UML; Tr&auml;germenge `$\mu$`, Aktueller Zustand einer Variablen `$\sigma$`</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1274086/Kap3-DDL.pdf">Kapitel 3</a>, Folie 32 - <a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1274693/Kap4-ERModell.pdf">Kapitel 4</a>, Folie 33</td> </tr> <tr> <td>29.04.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Systemunabh&auml;ngige Modellierung - Strukturelle Seite; <span class="hint" title="keine Instanzen, aber Ableitungen">abstrakte Klassen</span>, <span class="hint" title="Enthalten Methoden zur Erzeugung von Klassen">Metaklassen</span>, Parametrisierte Klassen; <span class="hint" title="Auto: R&auml;der, Lenkrad, Motor, Karosserie, ...">Aggregation</span> und <span class="hint" title="Fu&szlig;ballmanschaft besteht aus Spielern">Assoziation</span></td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1275725/Kap5-DMfuerRealis.pdf">Kapitel 5</a>, Folie 1 - <a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1275734/Kap6-Abb-ER2RDM.pdf">Kapitel 6</a>, Folie 24</td> </tr> <tr> <td>06.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;"><abbr title="functional dependency">FD</abbr>, Reflexivit&auml;t, Projektivit&auml;t, Akkumulation, RAP-Regeln, Einf&uuml;geanomalie, L&ouml;schanomalie; Abh&auml;ngigkeitstreue / Verbundtreue; 1. - 4. Normalform</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1282295/Kap7-relEntwurf-Teil1.pdf">Kapitel 7</a></td> </tr> <tr> <td>13.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Nebenl&auml;ufigkeitsprobleme: Lost update, dirty read, non-repeatable read; Serielle Ausf&uuml;hrung beseitigt Probleme, aber IO/Kommunikation machts ineffizient; History, Prefix Commit-Closed, commited projection; Transaktionen</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1289715/Kap11-ConcurrencyControl.pdf">Kapitel 11</a></td> </tr> <tr> <td>24.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Serialisierbarkeitsgraph; Synthese-Verfahren; BCNF; Histories: <abbr title="Recoverability">RC</abbr>, <abbr title="Avoids Cascading Aborts: Lesen nur von commiteten Transaktionen">ACA</abbr>, <abbr title="Strict (einfach RC+ACA, oder?)">ST</abbr>; <span class="hint" title="Wenn ich eine Eigenschaft habe, dann gilt sie auch vor dem letzten commit">prefix commit-closed</span></td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1289715/Kap11-ConcurrencyControl.pdf">Kapitel 11</a></td> </tr> <tr> <td>27.06.2013</td> <td rowspan="2" style="border-bottom:1px solid black;">Kapitel 8: Relationale Algebra, Bereichskalk&uuml;l; Syntaktisch sicher `$\Rightarrow$` Semantisch sicher; Kapitel 12: Anwendungsprogrammierung</td> </tr> <tr> <td style="border-bottom:1px solid black;"><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1291006/Kap8-relAlg.pdf">Kapitel 8</a>, <a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1294925/Kap12-Schnittstellen.pdf">12</a></td> </tr> </table> <p>Falls hier was fehlt, k&ouml;nnt ihr mich gerne in den Kommentaren oder per Mail (info@martin-thoma.de) darauf aufmerksam machen. Ich bin ja mal gespannt, ob ich das bis zum Ende aktuell halte.</p> <h2>SQL</h2> <div class="highlight"><pre><code class="sql language-sql" data-lang="sql"><span class="k">create</span> <span class="k">view</span> <span class="n">MG</span> <span class="k">as</span> <span class="k">select</span> <span class="n">Mitarbeiter</span><span class="p">,</span> <span class="n">Gehalt</span> <span class="k">from</span> <span class="n">MGA</span> <span class="k">where</span> <span class="n">Gehalt</span> <span class="o">&gt;</span> <span class="mi">70</span> </code></pre></div><div class="highlight"><pre><code class="sql language-sql" data-lang="sql"><span class="k">insert</span> <span class="k">into</span> <span class="n">MG</span> <span class="k">values</span> <span class="p">(</span><span class="s1">&#39;Alice&#39;</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span> </code></pre></div> <h2>Fragen</h2> <div class="question"> <span class="question">Was ist der Unterschied zwischen einem DBS und einem DBMS?</span> <div class="answer"> Ein <abbr title="Datenbankmanagementsystem">DBMS</abbr> ist eine Software zur Datenverwaltung. Die eigentlichen Daten sind in der Datenbank. Ein <abbr title="Datenbanksystem">DBS</abbr> ist eine DBMS und eine Datenbank. Ein DBMS kann mehrere Datenbanken verwalten. </div> <p></div></p> <div class="question"> <span class="question">Sei `$H = r_1[y] w_1[x] r_3[x] w_1[z] r_2[z] w_3[y] r_2[x] w_2[y] c1 r_3[y] c_3 w_2[z] c_2$`.<br/>Welche Transaktionen sind in dieser History?</span> <div class="answer"> <ul> <li>Ein Eintrag `$r_i[x]$` bedeutet, dass die Transaktion `$i$` die Ressource `$x$` liest.</li> <li>Ein Eintrag `$w_i[x]$` bedeutet, dass die Transaktion `$i$` die Ressource `$x$` schreibt.</li> <li>`$c_i$` bedeutet, dass die `$i$`-te Transaktion commitet wird</li> </ul> Es gibt also die Transaktion `$T_1, T_2 \text{ und } T_3$` mit `$T_1 = r_1[y] w_1[x] c_1$` </div> <p></div></p> <h2>Material</h2> <ul> <li><a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/1272509?client_size=1366x655">Folien</a></li> <li><a href="http://dbis.ipd.uni-karlsruhe.de/1969.php">Vorlesungswebsite</a></li> <li><a href="https://ankiweb.net/shared/info/3786791111">Mein Anki-Deck</a> (digitale Karteikarten)</li> <li><a href="http://mitschriebwiki.nomeata.de/Datenhaltung.pdf.4.pdf">Mitschrieb-Wiki</a></li> </ul> <p>In der Fachschaft gibt es folgende Altklausuren:</p> <ul> <li>25. Februar 2011</li> <li>30. Juli 2010 (DB + Rechnernetze, mit L&ouml;sung)</li> </ul> <h2>Aufbau der Klausur</h2> <p>H&auml;ufige Aufgabenstellungen sind:</p> <ul> <li>Histories und Transaktionen: Ist eine gegebene History RC, ACA, Strict?</li> <li>Modellierung</li> <li>SQL-Abfragen formulieren</li> </ul> <p>In der Klausur vom SS 2013 wurde das in 4 Aufgaben &agrave; 15 Punkte aufgeteilt. Unter anderem war diesmal der RAP-Algorithmus und der Dekompositionsalgorithmus relevant.</p> <h2>&Uuml;bungsbetrieb</h2> <p>Es gibt nur ein &quot;&Uuml;bungsblatt&quot; mit Bonuspunkten f&uuml;r die Klausur. Auf dieses beziehe ich mich.</p> <ul> <li>Wo sind die &Uuml;bungsbl&auml;tter: <a href="https://dalaran.ipd.kit.edu">Portal</a> - <a href="https://bscw.ira.uni-karlsruhe.de/pub/bscw.cgi/d1289127/SQL-%C3%9Cbungsblatt%20%28relevant%20f%C3%BCr%20Klausurbonus%29.pdf">Aufgaben</a></li> <li>Abgabeform: Online</li> <li>Abgabe: 07.07.2013</li> <li>R&uuml;cknahme: ?</li> <li>Turnus: Einmalig</li> <li>&Uuml;bungsschein verpflichtend: Nein</li> <li>Bonus durch &Uuml;bungsschein: Ja</li> </ul> <p>Ein paar interessante Informationen zum Blatt:</p> <div class="question"> <span class="question">Was ist mit "Brute-Force-Ans&auml;tze" in der Aufgabenstellung gemeint?</span> <div class="answer"> Antwort von Herrn Keller: Bei Anfragen, die nur eine Anzahl in der Projektionsliste erwarten, k&ouml;nnen sie mit einer Query <code>SELECT <korrekte_Anzahl> FROM <irgendeiner_Tabelle></code> das korrekte Ergebnistupel durch ausprobieren herausbekommen. Im Portal wird das zun&auml;chst als "korrekt" bewertet, allerdings werden wir das im Nachhinein filtern. </div> <p></div></p> <div class="question"> <span class="question">Wie kann man bei der ORACLE-Datenbank die Anzahl der ausgegebenen Zeilen beschr&auml;nken (LIMIT)?</span> <div class="answer"> [sql] SELECT * FROM ( your selection ) WHERE ROWNUM <= 5 [/sql] </div> <p></div></p> <p>Ein bisschen was zu <a href="http://en.wikipedia.org/wiki/Join_(SQL)">JOIN</a> sollte man sich durchlesen.</p> <p>Ich habe &uuml;brigens das folgende Captcha bekomme:</p> <div style="width: 293px" class="wp-caption aligncenter"><a href="../images/2013/04/captcha-db.png"><img src="../images/2013/04/captcha-db.png" alt="" width="293" height="221" class="size-full wp-image-70581"/></a><p class="wp-caption-text"></p></div> <p>Wie zur H&ouml;lle soll man das l&ouml;sen? Ich hatte auf &bdquo;448444&ldquo; getippt, aber das war falsch.</p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Mittwoch, den 31. Juli 2013 von 11:00 bis 13:00 Uhr <strong>Ort</strong>: seit 29.07.2013 online:</p> <table> <tr> <th>Wer</th> <th>Wo</th> </tr> <tr> <td>Nachnamen A-G</td> <td>Gerthsen H&ouml;rsaal</td> </tr> <tr> <td>Nachnamen H-J</td> <td>Nusselt H&ouml;rsaal</td> </tr> <tr> <td>Nachnamen K-L</td> <td>H&ouml;rsaal Neue Chemie</td> </tr> <tr> <td>Nachnamen M-R</td> <td>Daimler H&ouml;rsaal</td> </tr> <tr> <td>Nachnamen S</td> <td>Gaede H&ouml;rsaal</td> </tr> <tr> <td>Nachnamen T-Z</td> <td style="background-color:#cdcdcd">Benz H&ouml;rsaal</td> </tr> </table> <p><strong>Punkte</strong>: 60 <strong>Bestehensgrenze</strong>: ? <strong>&Uuml;bungsschein</strong>: ? <strong>Bonuspunkte</strong>: ?</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Sind noch nicht drau&szlig;en (Stand: 20.04.2013)</p> KogSys-Klausur http://martin-thoma.com/kogsys-klausur Fri, 19 Apr 2013 18:38:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/kogsys-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Kognitive Systeme&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn Dr. Waibel im Sommersemester 2013 geh&ouml;rt.</div> <h2>Behandelter Stoff</h2> <h3>Vorlesung</h3> <table> <tr> <td style="border-bottom:1px solid black;">15.04.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/KogSysSkript.pdf#page=5">Kapitel 1</a></td> <td style="border-bottom:1px solid black;">Einf&uuml;hrung</td> </tr> <tr> <td style="border-bottom:1px solid black;">17.04.2013</td> <td style="border-bottom:1px solid black;">&nbsp;</td> <td style="border-bottom:1px solid black;">Faltung, Fouriertransformation, Dirac-Funktion</td> </tr> <tr> <td style="border-bottom:1px solid black;">29.04.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/05_06-Classification_2013.pdf">Klassifikation I</a></td> <td style="border-bottom:1px solid black;">Schablonenanpassung: <span class="hint" title="Skalierung, Perspektiven, Drehung, Verzerrung, Helligkeit">Probleme</span>, Statistische Auswertung immer wichtig da Signale ambig sind, Assoziative Netze, Bayes Decision Theorie, Gaussian Classificator - "Covarianzmatrix tut das Richtige [und eliminiert von einander Abh&auml;ngige Dimensionen]", Mahalanobis-Distanz; Gauss-Klassifikator ist quadratischer Form (Kreis, Ellipse, Linie), Overfitting = "Vorurteil" passiert, wenn man zu wenig Daten bzw. zu viele Dimensionen daf&uuml;r hat - "Fluch der Dimensionalit&auml;t"; Hauptachsentransformation reduziert Dimensionalit&auml;t</td> </tr> <tr> <td style="border-bottom:1px solid black;">06.05.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/07_08-MachineLearning_2013.pdf">Machine Lerning</a></td> <td style="border-bottom:1px solid black;">Klassifikation: Risikobetrachtung bei Klassifikatoren, Gaussian Mixtures, Parzan Windows (nicht-parametrisiert, &uuml;berwacht), Fisher Linear Discriminant (scatter matrix), Linear seperable, <a href="https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm">K-nearest neighbors</a> (nicht-parametrisch, nicht-linear, &uuml;berwacht)</td> </tr> <tr> <td style="border-bottom:1px solid black;">13.05.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/07_08-MachineLearning_2013.pdf#page=25">Neural Nets</a></td> <td style="border-bottom:1px solid black;">Perceptron Criterion Function; <abbr title="Multilevel Perceptron">MLP</abbr></td> </tr> <tr> <td style="border-bottom:1px solid black;">27.05.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/09_Bildverarbeitung1-2013.pdf">Bildverarbeitung I</a></td> <td style="border-bottom:1px solid black;">Lochkartenmodell, HSI-Farbmodell, RGB2HSI, RGB2Graustufen, <a href="http://de.wikipedia.org/wiki/Punktoperator_(Bildverarbeitung)#Histogrammspreizung_und_-stauchung">Histogrammspreizung</a></td> </tr> <tr> <td style="border-bottom:1px solid black;">29.05.2013</td> <td style="border-bottom:1px solid black;"><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/10_Bildverarbeitung2-2013.pdf">Bildverarbeitung II</a></td> <td style="border-bottom:1px solid black;">Pixel-Transformation, Bildverarbeitung, Merkmalsextraktion, Form, Struktur, Klassifikation</td> <tr> <td style="border-bottom:1px solid black;">03.06.2013</td> <td style="border-bottom:1px solid black;">(Nicht verf&uuml;gbar)</td> <td style="border-bottom:1px solid black;">2D-Bildverarbeitung: Schwellwert, Graustufen, Segmentierung, Kanten-/Knotenerkennung; Hough-Tranformation; Harris-Corner-Detector; Kalmanfilter; Erosion / Dilatation; &Ouml;ffnen / Schlie&szlig;en</td> <tr> <td style="border-bottom:1px solid black;">10.06.2013</td> <td style="border-bottom:1px solid black;">(Nicht verf&uuml;gbar)</td> <td style="border-bottom:1px solid black;">Spracherkennung: Lautbildung, Vokale werden durch 1., 2. Formante bestimmt</td> </tr> <tr> <td style="border-bottom:1px solid black;">24.06.2013</td> <td style="border-bottom:1px solid black;">(Nicht verf&uuml;gbar)</td> <td style="border-bottom:1px solid black;">3D-Bildverarbeitung: Kalmanfilter; Partikelfilter; homogene Koordinaten</td> </tr> </table> <p>Falls hier was fehlt, k&ouml;nnt ihr mich gerne in den Kommentaren oder per Mail (info@martin-thoma.de) darauf aufmerksam machen.</p> <h3>Folien</h3> <h4>01: Einf&uuml;hrung</h4> <p>Nichts interessantes.</p> <h4>02, 03: Digital Signal Processing</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Alias-Effekt">Alias-Effekt</a>, <a href="http://de.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem">Abtasttheorem</a></li> <li>Digitalisierung: Zeit- und Wertdiskretisierung</li> <li><a href="http://de.wikipedia.org/wiki/Dirac-Funktion">Dirac-Funktion</a></li> <li>Faltung</li> <li>Fouriertransformation</li> <li>Korrelation: Autokorrelation, Kreuzkorrelation</li> </ul> <h4>04: Intelligente und Kognitive Systeme</h4> <p>Interessant, aber vermutlich nicht Klausurrelevant.</p> <h4>05, 06: Klassifikation</h4> <ul> <li>Schablonenanpassung: Wie &auml;hnlich ist das Muster einer Schablone?</li> <li>Normalisierung der Helligkeit</li> <li>Gauss-Klassifikation: Parametrisch</li> <li>Parzen Window: Nicht parametrisch</li> <li>k-nearest-neighbor: nicht parametrisch</li> <li>Perceptron: nicht parametrisch</li> <li>Bayes-Regel</li> <li>Principal Component Analysis (PCA)</li> <li>Linear Discriminant Function, Fisher-Linear Discriminant</li> </ul> <h4>07, 08: Machine Learning</h4> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/04/pattern-recognition-classification-300x172.png"><img src="../images/2013/04/pattern-recognition-classification-300x172.png" alt="" width="300" height="172" class="size-medium wp-image-76312"/></a><p class="wp-caption-text"></p></div> <ul> <li>Perceptron<: <a href="http://de.wikipedia.org/wiki/Sigmoidfunktion">Sigmoidfunktion</a>/li> <li>Classifier Discriminant Functions</li> <li>Linear Discriminant Functions</li> </ul> <h4>09: Bildverarbeitung I</h4> <ul> <li>Bildrepr&auml;sentation als Monochrombild</li> <li>RGB / HSI-Modell</li> <li>Bayer-Pattern</li> <li>Lochkamera-Modell</li> <li>Affine Punktoperatoren: `$g := round(a \cdot I(u,v) + b) I'(u,v) := \begin{cases} 0 &\text{, falls } g < 0\\ q &\text{, falls } g > q\\ g &\text{sonst} \end{cases}$` <ul> <li>Kontrasterh&ouml;hung: `$b=0; a > 1$`</li> <li>Kontrastverminderung: `$b=0; a < 1$`</li> <li>Helligkeitserh&ouml;hung: `$b>0; a = 1$`</li> <li>Helligkeitsverminderung: `$b<0; a = 1$`</li> <li>Invertierung: `$b=q; a =-1$`</li> </ul> </li> <li>Nicht-Affine Punktoperatoren</li> <li>Automatische Kontrastanpassung (Spreizung, Histogrammdehnung, Histogrammausgleich)</li> </ul> <h4>10: Bildverarbeitung II</h4> <ul> <li>Fourier-Transformation</li> <li>2D Fourier-Transformation</li> <li>Fourier-R&uuml;cktransformation</li> <li>Ortsbereich / Frequenzbereich</li> <li>Tiefpassfilter <ul> <li>Mittelwertfilter: Rauschunterdr&uuml;ckung</li> <li><strong>Gau&szlig;-Filter</strong>: Rauschunterdr&uuml;ckung, Gl&auml;ttung</li> </ul> </li> <li>Hochpassfilter <ul> <li>Prewitt</li> <li>Sobel</li> <li>Laplace</li> <li>Roberts</li> </ul> </li> <li>KOmbinierte Operatoren <ul> <li>Laplacian of Gaussian</li> </ul> </li> <li>Canny-Kantendetektor</li> </ul> <h4>11: Bildverarbeitung III</h4> <ul> <li>Segmentierung (Schwelltwert, Farbe)</li> <li>Morphologische Operatoren: Dilatation, Erosion</li> <li>&Ouml;ffnen, Schlie&szlig;en</li> <li>Hough-Transformation</li> <li>Sum of Squared Differences; Zero Mean Normalized Cross-Correlation</li> <li>Partikelfilter</li> </ul> <h4>12: Spracherkennung</h4> <ul> <li>Faltung</li> <li>Formanten</li> <li>Spektogramm</li> <li>Akustisches Modell, Sprachmodell</li> <li>(Hidden-)Markov-Modell</li> <li><strong>Forward-, Forward-Backward- und Viterbi-Algorithmus</strong></li> </ul> <h4>13: ?</h4> <h4>14: ?</h4> <h4>15: Bildverarbeitung IV</h4> <ul> <li>Geometrische 3D-Transformationen: Rotation um Achsen</li> <li>Quaternionen</li> <li>Erweitertes Lochkameramodell</li> <li>Kamerakalibrierung</li> <li>Diskrete Lineare Transformation</li> <li>Stereorekonstruktion</li> <li>Epipolargeometrie</li> <li>Fundamentalmatrix</li> </ul> <h4>16: Visuelle Wahrnehmung</h4> <p>Vermutlich nichts Klausurrelevantes (offiziell ab Folie 25)</p> <h4>17: Wissen und Planung I</h4> <ul> <li>Satz, Wissensdatenbank, Deduktion</li> <li>Symbolmenge, Modellmenge, Syntax, Semantik</li> <li>Korrektheit und vollst&auml;ndigkeit eines Deduktions-Algorithmus</li> <li>Algorithmen: <strong>Resolution, Horn-Klauseln, DPLL</strong></li> <li>Planungssprachen: <strong><abbr title="STanford Research Institute Problem Solver">STRIPS</abbr>, <abbr title="Action Description Language">ADL</abbr></strong></li> <li><strong>A*-Suche, Partial-Order-Planning, Planungsgraphen</strong></li> </ul> <h4>18: Wissen und Planung II</h4> <ul> <li>Partial-Order-Planning</li> <li>Planungsgraphen</li> <li>Kantenmodell, Oberfl&auml;chenmodell, Volumenmodell</li> <li>Freiraum, Hindernisraum, Konfigurationsraum</li> <li>Polygonzerlegung</li> <li>Sichtgraphen</li> <li>Quadtrees</li> <li>Voronoi-Diagramme</li> <li>Potentialfeldmethode</li> </ul> <h4>19: Robotik</h4> <p>Offiziell nicht Klausurrelevant.</p> <h2>Material</h2> <ul> <li><a href="http://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/">Vorlesungswebsite</a></li> <li><a href="https://ankiweb.net/shared/info/2853080322">Mein Anki-Deck</a></li> <li><a href="http://www.next-internet.com/hauptstudium/">Klausuren</a></li> <li><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/vorlesungsfolien.php">Folien</a></li> <li><a href="https://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/save/KogSysSkript.pdf">Skript</a></li> <li><a href="https://github.com/elm/KogSys-Zusammenfassung">Zusammenfassung</a></li> <li>Videos <ul> <li><a href="http://www.youtube.com/watch?v=aVId8KMsdUU">Neural network tutorial: The back-propagation algorithm</a></li> <li><a href="http://www.youtube.com/watch?v=46Jzu-xWIBk">The backpropagation algorithm</a></li> </ul> </li> <li>Pseudocode f&uuml;r <ul> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/DPLL">DPLL-Verfahren</a></li> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/Resolutionsalgorithmus">Resolutions-Algorithmus</a></li> </ul> </li> <li><a href="http://colorizer.org/">Colorizer</a>: Hier kann man ein bisschen mit Farbr&auml;umen rumspielen und die Unterschiede interaktiv feststellen.</li> <li>StackOverflow: <ul> <li><a href="http://math.stackexchange.com/q/487245/6876">Why is `$(-1) \cdot j = j \cdot (-1)$` for quaternions?</a></li> </ul> </li> <li>Artikel: <ul> <li><a href="../graphic-filters/">Graphic filters</a>: Mit einem interaktiven Beispiel aller Filter!</li> <li><a href="../k-nearest-neighbor-clustering-interactive-example/">Clustering-Algorithmen</a>: Mit interaktivem Beispiel</li> <li><a href="../calculations-with-quaternions/">Calculations with quaternions</a></li> <li><a href="../calculate-histogram-equalization/">How do I calculate a histogram equalization?</a></li> <li><a href="../apply-viterbi-aglrithm/">How to apply the Viterbi algorithm</a></li> <li><a href="../html5/route-planning/route-planning.htm">Interactive example for route planning</a></li> <li><a href="../word-error-rate-calculation/">Word Error Rate (WER) calculation</a></li> </ul> </li> <li>Grafische Faltung: <ul> <li><a href="http://www.jhu.edu/signals/convolve/">John Hopkins University</a>, Java Applet</li> <li><a href="http://www.onmyphd.com/?p=convolution">onmyphd.com</a>, JavaScript</li> </ul> </li> </ul> <p>Das Passwort f&uuml;r kogsys darf ich auch im Jahr 2013 nicht verraten.</p> <h2>Aufbau der Klausur</h2> <p>6 Aufgaben: <ul> <li>Bildverarbeitung</li> <li>Bildverarbeitung, Filter und Transformation</li> <li>Logik, Wissensrepr&auml;sentation und Planung <ul> <li>Eine Aufgabe, in der man den Resolutionsalgorithmus / das DPLL-Verfahren anwenden muss</li> <li>A*-Algorithmus</li> </ul> </li> <li>Allgemeine Fragen</li> <li>Signal- und Sprachverarbeitung</li> <li>Klassifikation und Maschinelles Lernen</li> </ul></p> <h2>&Uuml;bungsbetrieb</h2> <ul> <li>Wo sind die &Uuml;bungsbl&auml;tter: <a href="http://his.anthropomatik.kit.edu/Teaching/VorlesungKognitiveSysteme/websubmit/student/blattuebersicht.php">Link</a></li> <li>Abgabeform: nur Handschriftlich</li> <li>Abgabe: teilweise online, teilweise offline, wenn offline m&uuml;ssen die &Uuml;bungsbl&auml;tter direkt vor der &Uuml;bung abgegeben werden, oder irgendwann davor im B&uuml;ro des &Uuml;bungsleiters in der Kinderklinik. Direkt im B&uuml;ro scheint ihm aber nicht so lieb zu sein.</li> <li>R&uuml;cknahme: gar nicht, empfohlen wird eine Kopie des Originals zu behalten</li> <li>Turnus: ? (6 Bl&auml;tter insgesammt)</li> <li>&Uuml;bungsschein verpflichtend: es gibt keinen &Uuml;bungsschein soweit ich wei&szlig;</li> <li>Bonus durch &Uuml;bungsschein: pro &Uuml;bungsblatt max. 1 Bonuspunkt &rarr; max. 6 Bonuspunkte (es gibt tats&auml;chlich 0,25-Punkte!)</li> </ul> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Mittwoch, den 18. September 2013 von 11:00 bis 12:00 Uhr <strong>Ort</strong>: steht noch nicht fest (Stand: 12.09.2013) <strong>Punkte</strong>: 60 <strong>Bestehensgrenze</strong>: 20 <strong>&Uuml;bungsschein</strong>: Gibt es nicht <strong>Bonuspunkte</strong>: Ja, max 6 <strong>Ergebnisse</strong>: ab 14.10.2013 im Websubmit und in 50.20. (Kinderklinik) am Eingang <strong>Einsicht</strong>: 24.10.2013 von 13:30 bis 14:30 Uhr (Kinderklinik, Raum 148)</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Sind noch nicht drau&szlig;en (Stand: 18.09.2013)</p> Numerik-Klausur http://martin-thoma.com/numerik-klausur Fri, 19 Apr 2013 18:05:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/numerik-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Numerische Mathematik f&uuml;r die Fachrichtungen Informatik und Ingenieurwesen&ldquo; des Moduls &bdquo;Praktische Mathematik&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn Dr. Wei&szlig; im Sommersemester 2013 geh&ouml;rt.</div> <h2>Behandelter Stoff</h2> <p><strong>Vorlesung</strong>: <table> <tr> <td>17.04.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel1.pdf">Kapitel 1.1</a></td> <td>Wiederholung LGS, <a href="../solving-linear-equations-with-gaussian-elimination/" title="Solving linear equations with Gaussian elimination">Gausches Eliminationsverfahren</a>, <a href="http://www.youtube.com/watch?v=MTKkiSCBo74">LR-Zerlegung</a>, Frobeniusmatrix</td> </tr> <tr> <td>24.04.2013</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>01.05.2013</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>08.05.2013</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>15.05.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel1.pdf#page=19">Kapitel 1.4</a></td> <td>Vorw&auml;rts- und R&uuml;ckw&auml;rtsanalyse</td> </tr> <tr> <td>22.05.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel1.pdf#page=29">Kapitel 1.7</a></td> <td>Lineare Ausgleichsprobleme; QR-Zerlegung</td> </tr> <tr> <td>29.05.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel1.pdf#page=29">Kapitel 1.7</a>-2.1</td> <td>Fixpunktiteration</td> </tr> <tr> <td>05.06.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel2.pdf#page=4">Kapitel 2</a></td> <td>Banachscher Fixpunktsatz; Newton-Verfahren; Vereinfachtes Newton-Verfahren</td> </tr> <tr> <td>12.06.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel3a.pdf">Kapitel 3</a> - 3.1.2</td> <td>Interpolation von Funktionen mittels Polynomen (&rarr; <a href="../polynomial-interpolation/" title="Polynomial interpolation">Artikel</a>); Monomdarstellung; Lagrange-Polynome; Newton-Polynome; Dividierende Differenzen</td> </tr> <tr> <td>26.06.2013</td> <td><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/media/kapitel3.pdf#page=15">Kapitel 3.2</a> - S. 54, unten</td> <td><a href="../spline-interpolation/" title="Spline interpolation">Kubische Spline-Interpolation</a> &rarr; <a href="../html5/polynom-interpolation.htm">Visualisierung</a></td> </tr> </table></p> <h3>Skript</h3> <p>Kapitel 1: <ul> <li>Wann ist ein LGS eindeutig l&ouml;sbar? Wann gibt es unendlich viele L&ouml;sungen?</li> <li>Gau&szlig;sches Eliminationsverfahren</li> <li>Was versteht man unter Vorw&auml;rts / R&uuml;ckw&auml;rtssubstitution?</li> <li>Beim Gau&szlig;&#39;schen Eliminationsverfahren mit Spaltenpivotwahl tauscht man eine Zeile nach oben. Ist es das betragsm&auml;&szlig;ig gr&ouml;&szlig;te oder kleinste? Warum?</li> <li>Was ist eine Permutationsmatrix? Was eine Frobeniusmatrix?</li> <li>LR-Zerlegung</li> <li>Was ist eine unipotente Dreiecksmatrix? Was ist eine obere Dreiecksmatrix, was eine untere?</li> <li>Was ist Stellenausl&ouml;schung? Nenne ein Beispiel!</li> </ul></p> <h3>&Uuml;bungsbl&auml;tter</h3> <p>Die Aufgabenbl&auml;tter stehen <a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/seite/uebnuminfing#%C3%9Cbungsbl%C3%A4tter">hier</a>.</p> <table> <tr> <th>#</th> <th>Stoff</th> </tr> <tr> <td>1</td> <td>LR-Zerlegung, Normen</td> </tr> <tr> <td>2</td> <td>Konditionszahl einer Matrix, Stellenausl&ouml;schung, relativer Fehler</td> </tr> <tr> <td>3</td> <td>-</td> </tr> <tr> <td>4</td> <td>LR-Zerlegung, Gau&szlig;-Elimination mit Spaltenpivotwahl</td> </tr> <tr> <td>5</td> <td><a href="../wie-berechnet-man-die-cholesky-zerlegung/">Cholesky-Zerlegung</a></td> </tr> <tr> <td>6</td> <td>Nichtlineare Gleichungssysteme, Newton-Verfahren</td> </tr> <tr> <td>7</td> <td>Fixpunktiteration, Polynomauswertung, Interpolation</td> </tr> <tr> <td>8</td> <td>Tschebyscheff-Polynom, Interpolation</td> </tr> <tr> <td>9</td> <td>Splines</td> </tr> <tr> <td>10</td> <td>Bernstein-Polynom, Bezier-Kurven</td> </tr> <tr> <td>11</td> <td>Quadraturformeln</td> </tr> </table> <h2>Material</h2> <ul> <li><a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/de">Vorlesungswebsite</a></li> <li><a href="https://ankiweb.net/shared/info/3163682033">Mein Anki-Deck</a> (erst 12 Karten; es ist noch im Aufbau)</li> <li><a href="../polynomial-interpolation/">Polynom- und Spline-Interpolation</a>: Ein interaktives Beispiel</li> <li><a href="http://schickling.github.io/algorithms/#/">schickling.github.io</a>: Viele Implementierungen</li> <li>Pseudocode <ul> <li><a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/source-code/Pseudocode/Cholesky-Zerlegung">Cholesky-Zerlegung</a>, siehe <a href="../wie-berechnet-man-die-cholesky-zerlegung/">Artikel</a></li> </ul> </li> <li>StackExchange: <ul> <li><a href="http://math.stackexchange.com/q/430141/6876">How do the different ancillary conditions for splines differ?</a></li> </ul> </li> </ul> <h2>Aufbau der Klausur</h2> <ul> <li>Aufgabe 1: LR-Zerlegung oder Cholesky-Zerlegung; Gau&szlig;-Elimination mit Spaltenpivotwahl; L&ouml;sen eines LGS</li> <li>Aufgabe 2: Nicht-lineare Gleichungssysteme, Fixpunktiteration, Newton-Verfahren</li> <li>Aufgabe 3: <ul> <li>a) Polynominterpolation mit Lagrange-Polynomen</li> <li>b) Newton-Darstellung des Polynoms bestimmen</li> </ul> </li> <li>Aufgabe 4: Quadraturformel herleiten und Integral n&auml;herungsweise berechnen</li> <li>Aufgabe 5: Ordnungsbedingungen, S&auml;tze 27 - 31</li> </ul> <h2>&Uuml;bungsbetrieb</h2> <ul> <li>Wo sind die &Uuml;bungsbl&auml;tter: <a href="http://www.math.kit.edu/ianm3/lehre/numainfing2013s/seite/uebnuminfing">Link</a></li> <li>Abgabeform: nur Handschriftlich</li> <li>Abgabe: Mittwochs, in der Vorlesung</li> <li>R&uuml;cknahme: Freitags, in der &Uuml;bung</li> <li>Turnus: w&ouml;chentlich</li> <li>&Uuml;bungsschein verpflichtend: Ja</li> <li>Bonus durch &Uuml;bungsschein: Nein</li> </ul> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Dienstag, den 24. September 2013 von 11:00 bis 13:00 Uhr <strong>Ort</strong>: steht seit dem 11.09.2013 fest: Klausureinteilung entsprechend des Anfangsbuchstabens des Nachnamens: <table> <tr> <td>Benz-H&ouml;rsaal (10.21)</td><td>A-C</td> </tr> <tr> <td>Daimler-H&ouml;rsaal (10.21)</td><td>D-G und <strong>I</strong></td> </tr> <tr> <td>Neue Chem. (30.46)</td><td>J-L</td> </tr> <tr> <td>Gerthsen-H&ouml;rsaal (30.21)</td><td><strong>H</strong> und M-R</td> </tr> <tr> <td>HS. a. F. (50.35)</td><td>S-Z</td> </tr> </table></p> <p><strong>Punkte</strong>: ? <strong>Bestehensgrenze</strong>: ? <strong>&Uuml;bungsschein</strong>: Verpflichtend (ist inzwischen auch eingetragen) <strong>Bonuspunkte</strong>: Gibt es nicht <strong>Einsicht</strong>: Termin noch nicht bekannt (Stand: 22.09.2013)</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Sind noch nicht drau&szlig;en (Stand: 22.09.2013)</p> What does #!/usr/bin/python mean? http://martin-thoma.com/what-does-usrbinpython-mean Tue, 16 Apr 2013 16:23:17 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-does-usrbinpython-mean <p>You&#39;ve probably already seen one of the following lines:</p> <div class="highlight"><pre><code class="text">#!/bin/sh #!/usr/bin/python #!/usr/bin/python3 #!/usr/bin/env python #!/usr/bin/perl #!/usr/bin/php #!/usr/bin/ruby </code></pre></div> <p>This is a <a href="http://en.wikipedia.org/wiki/Shebang_%28Unix%29">shebang</a>. It&#39;s a directive for your command line interpreter how it should execute a script.</p> <p>For example, you have a file with this content:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python3</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="k">print</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">)</span> </code></pre></div> <p>Now you can execute it via <code>python3 yourFile.py</code>. But alternatively, you can make it executable and simply type <code>./yourFile.py</code></p> <p>By the way, you should use <code>#!/usr/bin/env python</code> <a href="http://stackoverflow.com/q/1352922/562769">for some reasons</a>.</p> Colors in Vim http://martin-thoma.com/colors-in-vim Tue, 09 Apr 2013 15:36:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/colors-in-vim <h2>ANSI Color codes</h2> <table> <tr> <td style="background: black;color:white">0</td> <td style="background: maroon;color:white">1</td> <td style="background: green;color:white">2</td> <td style="background: olive;color:white">3</td> <td style="background: navy;color:white">4</td> <td style="background: purple;color:white">5</td> <td style="background: teal;color:white">6</td> <td style="background: silver;color:black">7</td> </tr> </table> <h2>256 colors</h2> <p>You might need to <code>set t_Co=256</code>.</p> <table> <tr> <td style="background:#000000">x016_Grey0</td> <td style="background:#00005f">x017_NavyBlue</td> <td style="background:#000087">x018_DarkBlue</td> <td style="background:#0000af">x019_Blue3</td> </tr> <tr> <td style="background:#0000d7">x020_Blue3</td> <td style="background:#0000ff">x021_Blue1</td> <td style="background:#005f00">x022_DarkGreen</td> <td style="background:#005f5f">x023_DeepSkyBlue4</td> </tr> <tr> <td style="background:#005f87">x024_DeepSkyBlue4</td> <td style="background:#005faf">x025_DeepSkyBlue4</td> <td style="background:#005fd7">x026_DodgerBlue3</td> <td style="background:#005fff">x027_DodgerBlue2</td> </tr> <tr> <td style="background:#008700">x028_Green4</td> <td style="background:#00875f">x029_SpringGreen4</td> <td style="background:#008787">x030_Turquoise4</td> <td style="background:#0087af">x031_DeepSkyBlue3</td> </tr> <tr> <td style="background:#0087d7">x032_DeepSkyBlue3</td> <td style="background:#0087ff">x033_DodgerBlue1</td> <td style="background:#00af00">x034_Green3</td> <td style="background:#00af5f">x035_SpringGreen3</td> </tr> <tr> <td style="background:#00af87">x036_DarkCyan</td> <td style="background:#00afaf">x037_LightSeaGreen</td> <td style="background:#00afd7">x038_DeepSkyBlue2</td> <td style="background:#00afff">x039_DeepSkyBlue1</td> </tr> <tr> <td style="background:#00d700">x040_Green3</td> <td style="background:#00d75f">x041_SpringGreen3</td> <td style="background:#00d787">x042_SpringGreen2</td> <td style="background:#00d7af">x043_Cyan3</td> </tr> <tr> <td style="background:#00d7d7">x044_DarkTurquoise</td> <td style="background:#00d7ff">x045_Turquoise2</td> <td style="background:#00ff00">x046_Green1</td> <td style="background:#00ff5f">x047_SpringGreen2</td> </tr> <tr> <td style="background:#00ff87">x048_SpringGreen1</td> <td style="background:#00ffaf">x049_MediumSpringGreen</td> <td style="background:#00ffd7">x050_Cyan2</td> <td style="background:#00ffff">x051_Cyan1</td> </tr> <tr> <td style="background:#5f0000">x052_DarkRed</td> <td style="background:#5f005f">x053_DeepPink4</td> <td style="background:#5f0087">x054_Purple4</td> <td style="background:#5f00af">x055_Purple4</td> </tr> <tr> <td style="background:#5f00d7">x056_Purple3</td> <td style="background:#5f00ff">x057_BlueViolet</td> <td style="background:#5f5f00">x058_Orange4</td> <td style="background:#5f5f5f">x059_Grey37</td> </tr> <tr> <td style="background:#5f5f87">x060_MediumPurple4</td> <td style="background:#5f5faf">x061_SlateBlue3</td> <td style="background:#5f5fd7">x062_SlateBlue3</td> <td style="background:#5f5fff">x063_RoyalBlue1</td> </tr> <tr> <td style="background:#5f8700">x064_Chartreuse4</td> <td style="background:#5f875f">x065_DarkSeaGreen4</td> <td style="background:#5f8787">x066_PaleTurquoise4</td> <td style="background:#5f87af">x067_SteelBlue</td> </tr> <tr> <td style="background:#5f87d7">x068_SteelBlue3</td> <td style="background:#5f87ff">x069_CornflowerBlue</td> <td style="background:#5faf00">x070_Chartreuse3</td> <td style="background:#5faf5f">x071_DarkSeaGreen4</td> </tr> <tr> <td style="background:#5faf87">x072_CadetBlue</td> <td style="background:#5fafaf">x073_CadetBlue</td> <td style="background:#5fafd7">x074_SkyBlue3</td> <td style="background:#5fafff">x075_SteelBlue1</td> </tr> <tr> <td style="background:#5fd700">x076_Chartreuse3</td> <td style="background:#5fd75f">x077_PaleGreen3</td> <td style="background:#5fd787">x078_SeaGreen3</td> <td style="background:#5fd7af">x079_Aquamarine3</td> </tr> <tr> <td style="background:#5fd7d7">x080_MediumTurquoise</td> <td style="background:#5fd7ff">x081_SteelBlue1</td> <td style="background:#5fff00">x082_Chartreuse2</td> <td style="background:#5fff5f">x083_SeaGreen2</td> </tr> <tr> <td style="background:#5fff87">x084_SeaGreen1</td> <td style="background:#5fffaf">x085_SeaGreen1</td> <td style="background:#5fffd7">x086_Aquamarine1</td> <td style="background:#5fffff">x087_DarkSlateGray2</td> </tr> <tr> <td style="background:#870000">x088_DarkRed</td> <td style="background:#87005f">x089_DeepPink4</td> <td style="background:#870087">x090_DarkMagenta</td> <td style="background:#8700af">x091_DarkMagenta</td> </tr> <tr> <td style="background:#8700d7">x092_DarkViolet</td> <td style="background:#8700ff">x093_Purple</td> <td style="background:#875f00">x094_Orange4</td> <td style="background:#875f5f">x095_LightPink4</td> </tr> <tr> <td style="background:#875f87">x096_Plum4</td> <td style="background:#875faf">x097_MediumPurple3</td> <td style="background:#875fd7">x098_MediumPurple3</td> <td style="background:#875fff">x099_SlateBlue1</td> </tr> <tr> <td style="background:#878700">x100_Yellow4</td> <td style="background:#87875f">x101_Wheat4</td> <td style="background:#878787">x102_Grey53</td> <td style="background:#8787af">x103_LightSlateGrey</td> </tr> <tr> <td style="background:#8787d7">x104_MediumPurple</td> <td style="background:#8787ff">x105_LightSlateBlue</td> <td style="background:#87af00">x106_Yellow4</td> <td style="background:#87af5f">x107_DarkOliveGreen3</td> </tr> <tr> <td style="background:#87af87">x108_DarkSeaGreen</td> <td style="background:#87afaf">x109_LightSkyBlue3</td> <td style="background:#87afd7">x110_LightSkyBlue3</td> <td style="background:#87afff">x111_SkyBlue2</td> </tr> <tr> <td style="background:#87d700">x112_Chartreuse2</td> <td style="background:#87d75f">x113_DarkOliveGreen3</td> <td style="background:#87d787">x114_PaleGreen3</td> <td style="background:#87d7af">x115_DarkSeaGreen3</td> </tr> <tr> <td style="background:#87d7d7">x116_DarkSlateGray3</td> <td style="background:#87d7ff">x117_SkyBlue1</td> <td style="background:#87ff00">x118_Chartreuse1</td> <td style="background:#87ff5f">x119_LightGreen</td> </tr> <tr> <td style="background:#87ff87">x120_LightGreen</td> <td style="background:#87ffaf">x121_PaleGreen1</td> <td style="background:#87ffd7">x122_Aquamarine1</td> <td style="background:#87ffff">x123_DarkSlateGray1</td> </tr> <tr> <td style="background:#af0000">x124_Red3</td> <td style="background:#af005f">x125_DeepPink4</td> <td style="background:#af0087">x126_MediumVioletRed</td> <td style="background:#af00af">x127_Magenta3</td> </tr> <tr> <td style="background:#af00d7">x128_DarkViolet</td> <td style="background:#af00ff">x129_Purple</td> <td style="background:#af5f00">x130_DarkOrange3</td> <td style="background:#af5f5f">x131_IndianRed</td> </tr> <tr> <td style="background:#af5f87">x132_HotPink3</td> <td style="background:#af5faf">x133_MediumOrchid3</td> <td style="background:#af5fd7">x134_MediumOrchid</td> <td style="background:#af5fff">x135_MediumPurple2</td> </tr> <tr> <td style="background:#af8700">x136_DarkGoldenrod</td> <td style="background:#af875f">x137_LightSalmon3</td> <td style="background:#af8787">x138_RosyBrown</td> <td style="background:#af87af">x139_Grey63</td> </tr> <tr> <td style="background:#af87d7">x140_MediumPurple2</td> <td style="background:#af87ff">x141_MediumPurple1</td> <td style="background:#afaf00">x142_Gold3</td> <td style="background:#afaf5f">x143_DarkKhaki</td> </tr> <tr> <td style="background:#afaf87">x144_NavajoWhite3</td> <td style="background:#afafaf">x145_Grey69</td> <td style="background:#afafd7">x146_LightSteelBlue3</td> <td style="background:#afafff">x147_LightSteelBlue</td> </tr> <tr> <td style="background:#afd700">x148_Yellow3</td> <td style="background:#afd75f">x149_DarkOliveGreen3</td> <td style="background:#afd787">x150_DarkSeaGreen3</td> <td style="background:#afd7af">x151_DarkSeaGreen2</td> </tr> <tr> <td style="background:#afd7d7">x152_LightCyan3</td> <td style="background:#afd7ff">x153_LightSkyBlue1</td> <td style="background:#afff00">x154_GreenYellow</td> <td style="background:#afff5f">x155_DarkOliveGreen2</td> </tr> <tr> <td style="background:#afff87">x156_PaleGreen1</td> <td style="background:#afffaf">x157_DarkSeaGreen2</td> <td style="background:#afffd7">x158_DarkSeaGreen1</td> <td style="background:#afffff">x159_PaleTurquoise1</td> </tr> <tr> <td style="background:#d70000">x160_Red3</td> <td style="background:#d7005f">x161_DeepPink3</td> <td style="background:#d70087">x162_DeepPink3</td> <td style="background:#d700af">x163_Magenta3</td> </tr> <tr> <td style="background:#d700d7">x164_Magenta3</td> <td style="background:#d700ff">x165_Magenta2</td> <td style="background:#d75f00">x166_DarkOrange3</td> <td style="background:#d75f5f">x167_IndianRed</td> </tr> <tr> <td style="background:#d75f87">x168_HotPink3</td> <td style="background:#d75faf">x169_HotPink2</td> <td style="background:#d75fd7">x170_Orchid</td> <td style="background:#d75fff">x171_MediumOrchid1</td> </tr> <tr> <td style="background:#d78700">x172_Orange3</td> <td style="background:#d7875f">x173_LightSalmon3</td> <td style="background:#d78787">x174_LightPink3</td> <td style="background:#d787af">x175_Pink3</td> </tr> <tr> <td style="background:#d787d7">x176_Plum3</td> <td style="background:#d787ff">x177_Violet</td> <td style="background:#d7af00">x178_Gold3</td> <td style="background:#d7af5f">x179_LightGoldenrod3</td> </tr> <tr> <td style="background:#d7af87">x180_Tan</td> <td style="background:#d7afaf">x181_MistyRose3</td> <td style="background:#d7afd7">x182_Thistle3</td> <td style="background:#d7afff">x183_Plum2</td> </tr> <tr> <td style="background:#d7d700">x184_Yellow3</td> <td style="background:#d7d75f">x185_Khaki3</td> <td style="background:#d7d787">x186_LightGoldenrod2</td> <td style="background:#d7d7af">x187_LightYellow3</td> </tr> <tr> <td style="background:#d7d7d7">x188_Grey84</td> <td style="background:#d7d7ff">x189_LightSteelBlue1</td> <td style="background:#d7ff00">x190_Yellow2</td> <td style="background:#d7ff5f">x191_DarkOliveGreen1</td> </tr> <tr> <td style="background:#d7ff87">x192_DarkOliveGreen1</td> <td style="background:#d7ffaf">x193_DarkSeaGreen1</td> <td style="background:#d7ffd7">x194_Honeydew2</td> <td style="background:#d7ffff">x195_LightCyan1</td> </tr> <tr> <td style="background:#ff0000">x196_Red1</td> <td style="background:#ff005f">x197_DeepPink2</td> <td style="background:#ff0087">x198_DeepPink1</td> <td style="background:#ff00af">x199_DeepPink1</td> </tr> <tr> <td style="background:#ff00d7">x200_Magenta2</td> <td style="background:#ff00ff">x201_Magenta1</td> <td style="background:#ff5f00">x202_OrangeRed1</td> <td style="background:#ff5f5f">x203_IndianRed1</td> </tr> <tr> <td style="background:#ff5f87">x204_IndianRed1</td> <td style="background:#ff5faf">x205_HotPink</td> <td style="background:#ff5fd7">x206_HotPink</td> <td style="background:#ff5fff">x207_MediumOrchid1</td> </tr> <tr> <td style="background:#ff8700">x208_DarkOrange</td> <td style="background:#ff875f">x209_Salmon1</td> <td style="background:#ff8787">x210_LightCoral</td> <td style="background:#ff87af">x211_PaleVioletRed1</td> </tr> <tr> <td style="background:#ff87d7">x212_Orchid2</td> <td style="background:#ff87ff">x213_Orchid1</td> <td style="background:#ffaf00">x214_Orange1</td> <td style="background:#ffaf5f">x215_SandyBrown</td> </tr> <tr> <td style="background:#ffaf87">x216_LightSalmon1</td> <td style="background:#ffafaf">x217_LightPink1</td> <td style="background:#ffafd7">x218_Pink1</td> <td style="background:#ffafff">x219_Plum1</td> </tr> <tr> <td style="background:#ffd700">x220_Gold1</td> <td style="background:#ffd75f">x221_LightGoldenrod2</td> <td style="background:#ffd787">x222_LightGoldenrod2</td> <td style="background:#ffd7af">x223_NavajoWhite1</td> </tr> <tr> <td style="background:#ffd7d7">x224_MistyRose1</td> <td style="background:#ffd7ff">x225_Thistle1</td> <td style="background:#ffff00">x226_Yellow1</td> <td style="background:#ffff5f">x227_LightGoldenrod1</td> </tr> <tr> <td style="background:#ffff87">x228_Khaki1</td> <td style="background:#ffffaf">x229_Wheat1</td> <td style="background:#ffffd7">x230_Cornsilk1</td> <td style="background:#ffffff">x231_Grey100</td> </tr> <tr> <td style="background:#080808">x232_Grey3</td> <td style="background:#121212">x233_Grey7</td> <td style="background:#1c1c1c">x234_Grey11</td> <td style="background:#262626">x235_Grey15</td> </tr> <tr> <td style="background:#303030">x236_Grey19</td> <td style="background:#3a3a3a">x237_Grey23</td> <td style="background:#444444">x238_Grey27</td> <td style="background:#4e4e4e">x239_Grey30</td> </tr> <tr> <td style="background:#585858">x240_Grey35</td> <td style="background:#626262">x241_Grey39</td> <td style="background:#6c6c6c">x242_Grey42</td> <td style="background:#767676">x243_Grey46</td> </tr> <tr> <td style="background:#808080">x244_Grey50</td> <td style="background:#8a8a8a">x245_Grey54</td> <td style="background:#949494">x246_Grey58</td> <td style="background:#9e9e9e">x247_Grey62</td> </tr> <tr> <td style="background:#a8a8a8">x248_Grey66</td> <td style="background:#b2b2b2">x249_Grey70</td> <td style="background:#bcbcbc">x250_Grey74</td> <td style="background:#c6c6c6">x251_Grey78</td> </tr> <tr> <td style="background:#d0d0d0">x252_Grey82</td> <td style="background:#dadada">x253_Grey85</td> <td style="background:#e4e4e4">x254_Grey89</td> <td style="background:#eeeeee">x255_Grey93</td> </tr> </table> <h2>Colorize Vim</h2> <p>You can highlight your current line by adding the following line to your <strong>.vimrc</strong>: <code>hi CursorLine cterm=NONE ctermbg=187</code></p> <p>The following line will use color 0 (black) for the text color of the line numbers and color 187 (see above) for the background. <code>highlight LineNr ctermfg=0 ctermbg=187</code></p> KV-Diagramme http://martin-thoma.com/kv-diagramme Mon, 25 Mar 2013 22:37:00 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/kv-diagramme <div class="info">Ich setze im Folgenden vorraus, dass man schon mal was von KV-Diagrammen geh&ouml;rt hat und vielleicht schon ein paar gezeichnet hat. Insbesondere erkl&auml;re ich nicht wie man aus dem KV-Diagramm der Gr&ouml;&szlig;e 16 eines der Gr&ouml;&szlig;e 32 bekomt und was die Beschriftung bedeutet.</div> <p>KV-Diagramme sind f&uuml;r die TI-Klausur am KIT bei Herrn Prof. Dr. Asfour sehr wichtig. Im folgenden sind die wichtigsten Eigenschaften, die so explizit leider nicht in der Vorlesung genannt wurden.</p> <h2>Konstruktion aus Schaltfunktion</h2> <p>Gegeben sei folgende vollst&auml;ndig definierte Schaltfunktion: <code>$f(w,x,y,z) := (w \lor \bar y) (\bar w \lor x \lor y) (\bar w \lor \bar x \lor z)$</code></p> <p>Nun kann man eine Funktionstabelle aufstellen: <ol> <li>Dabei schreibt man sich erst das Ger&uuml;st hin, also eine Titelzeile mit den vier Variablen <code>$w,x,y,z$</code> und <code>$2^4 = 16$</code> Zeilen f&uuml;r die verschiedenen Funktionswerte. Wir brauchen jeweils eine Spalte f&uuml;r die vier Variablen, eine f&uuml;r den Funktionswert <code>$f(w,x,y,z)$</code> und am besten noch eine mit der Nummer.</li> <li>Nun z&auml;hlen wir f&uuml;r die vier Variablen bin&auml;r hoch. Dabei einsprechen die konkatenierten Ziffern der Variablen der Spalte &bdquo;Nummer&ldquo;. Ich fine es am einfachsten, dies Spaltenweise zu schreiben. Also 8 Nullen, 8 Einsen f&uuml;r <code>$w$</code>. Dann 4 Nullen, 4 Einsen, 4 Nullen, 4 Einsen f&uuml;r <code>$x$</code> usw.</li> <li>Als letztes schauen wir uns die drei geklammerten Terme von oben an und schauen, wann diese jeweils Null sind. In die entsprechenden Zeilen der Tabelle tragen wir eine Null ein. In alle &Uuml;brigen kommt eine Eins.</li> </ol></p> <table> <thead> <tr> <th>Nr</th> <th>`$w$`</th> <th>`$x$`</th> <th>`$y$`</th> <th>`$z$`</th> <th>`$f(w,x,y,z)$`</th> </tr> </thead> <tbody> <tr> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> </tr> <tr> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>1</td> </tr> <tr> <td>2</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> </tr> <tr> <td>3</td> <td>0</td> <td>0</td> <td>1</td> <td>1</td> <td>0</td> </tr> <tr> <td>4</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> </tr> <tr> <td>5</td> <td>0</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> </tr> <tr> <td>6</td> <td>0</td> <td>1</td> <td>1</td> <td>0</td> <td>0</td> </tr> <tr> <td>7</td> <td>0</td> <td>1</td> <td>1</td> <td>1</td> <td>0</td> </tr> <tr> <td>8</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> </tr> <tr> <td>9</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> </tr> <tr> <td>10</td> <td>1</td> <td>0</td> <td>1</td> <td>0</td> <td>1</td> </tr> <tr> <td>11</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <td>12</td> <td>1</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> </tr> <tr> <td>13</td> <td>1</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> </tr> <tr> <td>14</td> <td>1</td> <td>1</td> <td>1</td> <td>0</td> <td>0</td> </tr> <tr> <td>15</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> </tbody> </table> <p>Will man diese Tabelle in ein KV-Diagramm &uuml;bernehmen, muss man nur die Spalte <code>$f(w,x,y,z)$</code> in der richtigen Reihenfolge in die Tabelle f&uuml;llen. Das macht man, indem man immer bei einem Eckpunkt beginnt und dann eine Z-Form durchgeht:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/karnaugh-map4-300x236.png"><img src="../images/2013/03/karnaugh-map4-300x236.png" alt="" width="300" height="236" class="size-medium wp-image-63191"/></a><p class="wp-caption-text"></p></div> <p>Am Ende sieht es so aus: <img src="../images/2013/03/karnaugh-map1.png" alt="KV-Diagramm" width="512" height="512" class="size-full wp-image-62871" /></p> <h2>Prim- und Kernprimimplikaten</h2> <p>Sei <code>$g(w,x,y,z)$</code> eine Schaltfunktion. <code>$g$</code> ist ein Implikant von <code>$f:\Leftrightarrow \forall_{(w,x,y,z) \in \{0,1\}^4}: g(w,x,y,z) \Rightarrow f(w,x,y,z)$</code>.</p> <p>Ist <code>$g$</code> ist ein Implikant von <code>$f$</code>, so ist <code>$f$</code> ein Implikat von <code>$g$</code>.</p> <p>Das kann man nun sehr sch&ouml;n mit dem KV-Diagramm verkn&uuml;pfen. Wenn man die beiden Funktionen <code>$f$</code> und <code>$g$</code> in das KV-Diagramm einzeichnet, muss <code>$f$</code> &uuml;berall dort eine 1 haben, wo <code>$g$</code> eine 1 hat.</p> <p>Was hat es nun mit Primimplikanten auf sich? Wenn man diese K&auml;stchen um 1-Bl&ouml;cke macht, dann m&uuml;ssen sie jeweils insgesamt genau <code>$2^k, k \in \mathbb{N}_0$</code> Einsen umfassen und d&uuml;rfen an den R&auml;ndern fortgesetz werden (siehe der gr&uuml;ne um 5 und 13). Wenn so ein Block ein Primimplikant ist, darf es keinen gr&ouml;&szlig;eren Eins-Block geben.</p> <p>Beispiel: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/karnaugh-map2-300x300.png"><img src="../images/2013/03/karnaugh-map2-300x300.png" alt="" width="300" height="300" class="size-medium wp-image-62901"/></a><p class="wp-caption-text"></p></div></p> <p>Das Rosa-K&auml;stchen ist ein Implikant. Es ist jedoch kein Primimplikant, da das blaue K&auml;stchen gr&ouml;&szlig;er ist. Bis auf das rosa K&auml;stchen und das braune K&auml;stchen sind alle eingezeichenten K&auml;stchen Primimplikanten sein. Es gibt keine weiteren Primimplikanten in dieser Funktion.</p> <p>Nun ist ein Primimplikant ein Kernprimimplikant, wenn er eine 1 &uuml;berdeckt, die von keinem anderen Primimplikanten &uuml;berdeckt wird. Das gilt f&uuml;r alle Primimplikanten au&szlig;er den hellgr&uuml;nen und den braunen K&auml;stchen.</p> <p>Nochmals f&uuml;r das Beispiel:</p> <p>Primimplikanten sind: <ul> <li>(0,1,5,4) // ganz oben, ist auch Kernprimimplikant</li> <li>(10,11) // 3. Zeile, ist auch Kernprimimplikant</li> <li>(11,15) // 3. Zeile, ist kein Kernprimimplikant</li> <li>(15,13) // 3. Spalte, ist kein Kernprimimplikant</li> <li>(13,5) // 3. Spalte, ist kein Kernprimimplikant</li> </ul></p> <p>Primimplikate sind: <ul> <li>(2,3,7,6) // 2. Zeile, ist auch Kernprimimplikat</li> <li>(6,14) // 4. Spalte, ist kein Kernprimimplikat</li> <li>(14,12) //4. Spalte, ist kein Kernprimimplikat</li> <li>(8,9) // 4. Zeile, ist auch Kernprimimplikat</li> <li>(8, 12) // 4. Zeile, ist kein Kernprimimplikat</li> </ul></p> <h2>Hasards</h2> <p>Wie sieht man einen Hasard im KV-Diagramm? Man sucht sich eine Anfangsbelegung und eine Endbelegung. Wenn sich dazwischen <code>$n$</code> Variablen &auml;ndern, gibt es <code>$n!$</code> Pfade im KV-Diagram. Ist einer dieser Pfade nicht monoton, so ist dieser &Uuml;bergang Hasardbehaftet.</p> <p>Nun kann man sich entweder die Funktion selbst im KV-Diagramm anschauen, oder die einzelnen Variablen mit dem Todzeitmodell aufsplitten. Untersucht man ersteres, kann man Funktionshasards finden, bei letzterem Strukturhasards.</p> <p>Nun kann man jeden Hasard noch aufteilen, je nach dem was der Wert der Funktion mit der Anfangsbelegung A bzw. der Wert der Funktion bei der Endbelegung B ist: <ul> <li><code>$f(A) = 0 \land f(B) = 0 \Rightarrow$</code> Statischer 0-Hasard</li> <li><code>$f(A) = 0 \land f(B) = 1 \Rightarrow$</code> Dynamischer 01-Hasard</li> <li><code>$f(A) = 1 \land f(B) = 0 \Rightarrow$</code> Dynamischer 10-Hasard</li> <li><code>$f(A) = 1 \land f(B) = 1 \Rightarrow$</code> Statischer 1-Hasard</li> </ul></p> <h3>Beispiel</h3> <p>Hier ist ein Beispiel f&uuml;r einen dynamischen 1-0-Hasard:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/karnaugh-map3-300x251.png"><img src="../images/2013/03/karnaugh-map3-300x251.png" alt="" width="300" height="251" class="size-medium wp-image-63011"/></a><p class="wp-caption-text"></p></div> <h2>Fallstricke</h2> <p>Bei dem Suchen nach Eins- oder Nullbl&ouml;cken darf man an den Spiegelachsen springen:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/kv-diagramm-fallstrick-1-300x180.png"><img src="../images/2013/03/kv-diagramm-fallstrick-1-300x180.png" alt="" width="300" height="180" class="size-medium wp-image-63151"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/kv-diagramm-fallstrick-2-300x173.png"><img src="../images/2013/03/kv-diagramm-fallstrick-2-300x173.png" alt="" width="300" height="173" class="size-medium wp-image-63161"/></a><p class="wp-caption-text"></p></div> What does volatile mean? http://martin-thoma.com/what-does-volatile-mean Wed, 20 Mar 2013 21:19:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-does-volatile-mean <p>You might have read the variable modifier <code>volatile</code> in C, C++ or in Java. But do you know what it means?</p> <h2>C Programming Language</h2> <p>The C Programming language by Kerninghan and Ritchie (second edition) contains this keyword only 13 times. Here are the most important ones: <blockquote>[...] declaring it volatile announces that it has special properties relevant to optimization. Neither qualifier affects the range of values or arithmetic properties of the object. Qualifiers are discussed in Par.A.8.2.</blockquote> Page 158</p> <blockquote>The purpose of volatile is to force an implementation to suppress optimization that could otherwise occur. For example, for a machine with memory-mapped input/output, a pointer to a device register might be declared as a pointer to volatile, in order to prevent the compiler from removing apparently redundant references through the pointer. Except that it should diagnose explicit attempts to change const objects, a compiler may ignore these qualifiers.</blockquote> <p>Page 172</p> <h2>Java</h2> <p>Java Language Specification actually covers this quite good:</p> <blockquote>The Java programming language allows threads to access shared variables (&sect;17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure that it has exclusive use of such variables by obtaining a lock that, conventionally, enforces mutual exclusion for those shared variables. The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes. A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (&sect;17.4).</blockquote> <p>Ok, so in Java it is important for multithreading. The example 8.3.1.4-1 of the <a href="http://docs.oracle.com/javase/specs/">JLS 7.0</a> is also very interesting.</p> <blockquote>A write to a volatile field (&sect;8.3.1.4) happens-before every subsequent read of that field.</blockquote> <blockquote>For the purposes of the Java programming language memory model, a single write to a non-volatile long or double value is treated as two separate writes: one to each 32-bit half. This can result in a situation where a thread sees the first 32 bits of a 64-bit value from one write, and the second 32 bits from another write. Writes and reads of volatile long and double values are always atomic.</blockquote> <h2>When do you need it volatile?</h2> <div class="warning">I'm not sure if it is correct what I write here. It makes sense, but please leave a note in comments when I'm wrong.</div> <h3>Thermometer</h3> <p>Imagine you want to build your own thermometer. So you have to access hardware. Now you only want to print the temperature periodically. Something like this:</p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;unistd.h&gt;</span> <span class="kt">int</span> <span class="nf">getTemperature</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// accessing the hardware device register happens here</span> <span class="k">return</span> <span class="mi">42</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">60</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">temperature</span> <span class="o">=</span> <span class="n">getTemperature</span><span class="p">();</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Temperature: %i &amp;deg;C</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">temperature</span><span class="p">);</span> <span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Now, as you always access the same register and you don&#39;t change it, the CPU could cache the result. That would be bad, because another source (the hardware) changes the value. So you don&#39;t want to cache it. This is - if I understand it correctly - what volatile is good for. It makes sure that you really access memory and not some registers, because it got optimized or cached.</p> <h3>I / O</h3> <p>Imagine you write an application that want to transfer data from a disk to another disk. You might have one producer and one consumer. The producer tries to get data from the disk. Lets say the disk has a buffer and a register that indicates how many blocks are in the buffer. So your producer might poll at some point:</p> <p><code>int register = 0; while(register == 0);</code></p> <p>Now the register can get changed by the device, but it seems to be an obvious that you can optimize this to</p> <p><code>while(TRUE);</code></p> <p>Now, with this &quot;optimization&quot; that the compiler might make, you will never notice when you can read from the disk. So you would mark register as volatile to tell the compiler that he should not optimize it.</p> <p>Do you know some better examples? Perhaps short C examples with real code where you can actually see the difference?</p> <h2>Further reading</h2> <ul> <li><a href="http://stackoverflow.com/q/3488703/562769">When exactly do you use the volatile keyword in Java?</a></li> <li><a href="http://stackoverflow.com/a/3430809/562769">Different meaning in Java and C#</a></li> </ul> C Puzzle #3 http://martin-thoma.com/c-puzzle-3 Sat, 16 Mar 2013 13:54:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/c-puzzle-3 <p>What is the output of the following programm?</p> <div class="highlight"><pre><code class="c"><span class="cp">#include&lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">13</span><span class="o">&gt;&gt;</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . .</p> <h2>Short answer</h2> <p>-7</p> <h2>Long answer</h2> <blockquote>Signed integers are two&rsquo;s complement binary values that can be used to represent both positive and negative integer values.</blockquote> <p>Source: <a href="http://download.intel.com/products/processor/manual/325462.pdf#page=82">Intels IA-32 Architectures Software Developer&#39;s Manuals</a>, page 83</p> <p>When you want to get the two&#39;s complement representation of -13, you have to get the binary representation of 13, invert the digits and add one. As 13 is 1101 in binary, -13 looks like this on a 32 bit machine: 1111.1111.1111.1111.1111.1111.1111.0011</p> <p>So two results might be logical: 0111.1111.1111.1111.1111.1111.1111.1001</p> <p>or</p> <p>1111.1111.1111.1111.1111.1111.1111.1001</p> <p>Lets get the assembly code:</p> <div class="highlight"><pre><code class="bash">gcc -S -O0 test.c </code></pre></div> <div class="highlight"><pre><code class="text"> .file &quot;test.c&quot; .section .rodata .LC0: .string &quot;%i\n&quot; .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl `$-16, %esp subl $`16, %esp movl `$-7, 4(%esp) movl $`.LC0, (%esp) call printf leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident &quot;GCC: (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2&quot; .section .note.GNU-stack,&quot;&quot;,@progbits </code></pre></div> <p>In line 18 you can see that the bitshift already happened. When you introduce a variable for <code>a</code>, you can see that the compiler makes use of the assembly command <code>sarl %eax</code> or <code>sarl $2, %eax</code> when you shift by two.</p> <p>When you take a look at Oracles <a href="http://docs.oracle.com/cd/E19455-01/806-3773/806-3773.pdf#page=56">IA-32 Assembly Language Reference Manual</a>, page 56, you find:</p> <blockquote>sar right shifts (signed divides) a byte, word, or long value for a count specified by an immediate value and stores the quotient in that byte, word, or long respectively. The second variation right shifts by a count value specified in the CL register. sar rounds toward negative infinity; <strong>the high-order bit remains unchanged</strong>.</blockquote> <p>This means, 1111.1111.1111.1111.1111.1111.1111.1001 is correct. And that&#39;s -7.</p> Google Reader Alternatives http://martin-thoma.com/google-reader-alternatives Fri, 15 Mar 2013 22:09:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-reader-alternatives <p>On July 1, 2013, Google will retire Google Reader (<a href="http://googleblog.blogspot.de/2013/03/a-second-spring-of-cleaning.html">source</a>). A first step should be to save your data (especially your subscriptions). You can do that with <a href="https://www.google.com/takeout">Google Takeout</a>. You could also sign a <a href="https://www.change.org/petitions/google-keep-google-reader-running">petition against closing Google Reader</a>, but I doubt that this will have any effect. Currently, 106,712 people support this petition, though.</p> <h2>How I used Google Reader</h2> <p>Most important for me was the Chrome plugin:</p> <p>[gallery columns=&quot;2&quot; size=&quot;medium&quot; ids=&quot;61401,61391&quot;]</p> <p>The website offered a nice, clean way to administrate my 109 Feeds. Last (and least) the Android App. I don&#39;t have my smartphone long enough to really use this app, but it is one of 10 Apps I&#39;ve currently installed.</p> <p>[gallery columns=&quot;2&quot; size=&quot;medium&quot; ids=&quot;61421,61411&quot;]</p> <p>Now, I am interested in alternatives. They should <ul> <li>allow me to import my subscriptions,</li> <li>have a Google Chrome Extension (in <a href="https://chrome.google.com/webstore?utm_source=chrome-ntp-icon">Chrome Web Store</a>)</li> <li>have an Android App (in <a href="https://play.google.com/store">Android Market</a>)</li> <li>have export options</li> <li>sync my feeds, as I would like to read my feeds on several computers and my smartphone</li> <li>allow me to login via Google OpenID</li> </ul></p> <h2>Web Services</h2> <h3>The Old Reader</h3> <p><a href="http://theoldreader.com/">The Old Reader</a> is a web service that wants to provide the same service as Google did before.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/theoldreader.com-feeds-import-300x175.png"><img src="../images/2013/03/theoldreader.com-feeds-import-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-61231"/></a><p class="wp-caption-text"></p></div> <p>Looks pretty good, doesn&#39;t it? But it currently displays the message &quot;There are 27283 users in the import queue ahead of you.&quot;</p> <h3>BazQux Reader</h3> <p><a href="http://bazqux.com/">BazQux Reader</a> seemed to be a real alternative. It allowed me to sign in with Google, import my subscriptions and it looked familiar:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/bazqux.com_-300x222.png"><img src="../images/2013/03/bazqux.com_-300x222.png" alt="" width="300" height="222" class="size-medium wp-image-61261"/></a><p class="wp-caption-text"></p></div> <p>Another point for BazQux: It supports OPML-Export (Click on the icon at the top right corner &rarr; Subscriptions &rarr; Export OPML)</p> <p>But now the drawbacks: <ul> <li>9 $/year</li> <li>no Chrome plugin</li> <li>no Android App</li> </ul></p> <h3>Bloglovin'</h3> <div class="warning">Bloglovin sends you emails with your feeds. Those emails don't have an unsubscribe link.</div> <p><a href="http://www.bloglovin.com/">Bloglovin&#39;</a> is another WebService that looks very nice and is free, seems to be a real alternative. While importing my subscriptions, I got a 504 Gateway Time-out, but it imported my feeds anyway.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/bloglovin-300x210.png"><img src="../images/2013/03/bloglovin-300x210.png" alt="" width="300" height="210" class="size-medium wp-image-61271"/></a><p class="wp-caption-text"></p></div> <p>The service seems to be free, they have an <a href="https://play.google.com/store/apps/details?id=se.yo.android.bloglovin">Android App</a> and an <a href="https://itunes.apple.com/app/bloglovin/id421818340?mt=8">iPhone App</a>, but no Google Chrome App and I can&#39;t sign in with Google.</p> <p>Bloglovin&#39; does not provide an export function.</p> <h3>Good Noows</h3> <p>It seems to get better. <a href="http://goodnoows.com/">Good Noows</a> lets me sign in with Google, offers an import function and has a <a href="https://chrome.google.com/webstore/detail/good-noows/deegloljmdbfbjhlimieancmcfombgjj?utm_source=chrome-ntp-icon">Chrome App</a>. I seems to be free.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/goodnoows-300x183.png"><img src="../images/2013/03/goodnoows-300x183.png" alt="" width="300" height="183" class="size-medium wp-image-61291"/></a><p class="wp-caption-text"></p></div> <p>However, it has no Android App and seems not to support export.</p> <h3>Bloglines</h3> <p><a href="http://www.bloglines.com/index.html">Bloglines</a> offers an export function! I can&#39;t login with Google, but I can import my 109 Feeds. </p> <p>It looks like this: <a href="../images/2013/03/bloglines.png"><img src="../images/2013/03/bloglines-300x184.png" alt="bloglines" width="300" height="184" class="aligncenter size-medium wp-image-61351" /></a></p> <p>It has no Chrome App and the <a href="https://play.google.com/store/apps/details?id=org.nyquil.rss2bloglines&feature=search_result#?t=W251bGwsMSwyLDEsIm9yZy5ueXF1aWwucnNzMmJsb2dsaW5lcyJd">Android App</a> is possibly not official.</p> <h2>Host yourself</h2> <h3>Selfoss</h3> <p><a href="http://selfoss.aditu.de/">Selfoss</a> gives you the possibility to host your RSS-Aggregator by yourself. It looks quite good, requires only PHP 5.3 and MySQL and mobiles are supported.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/selfoss-300x203.png"><img src="../images/2013/03/selfoss-300x203.png" alt="" width="300" height="203" class="size-medium wp-image-68361"/></a><p class="wp-caption-text"></p></div> <ul> <li>Selfoss: <a href="https://github.com/SSilence/selfoss">GitHub</a>, <a href="http://selfoss.aditu.de/">Download</a></li> </ul> <h3>Tiny Tiny RSS</h3> <p><a href="http://tt-rss.org/redmine/projects/tt-rss/wiki">TT-RSS</a> allows you to host a service similar to Google Reader. This could be an interesting alternative, but currently the demo page is disabled. I&#39;m waiting for reviews of this one.</p> <ul> <li>Tiny Tiny RSS: <a href="https://github.com/gothfox/Tiny-Tiny-RSS">GitHub</a>, <a href="http://tt-rss.org/redmine/projects/tt-rss-android/issues">Issue Tracker</a>, <a href="http://tt-rss.org/redmine/projects/tt-rss/wiki#Download">Download</a>, <a href="https://www.softaculous.com/demos/Tiny_Tiny_RSS">Demo</a></li> <li>Android Client: <a href="https://play.google.com/store/apps/details?id=org.fox.ttrss&feature=search_result">Market</a></li> </ul> <h2>Tried, but no alternative</h2> <ul> <li><a href="https://www.pulse.me/">Pulse</a>: Where can I add RSS-Feeds in this service?</li> <li><a href="http://www.feedafever.com/#account">FeedAFever</a>: Why should I pay for this, when there are free services?</li> <li><a href="http://blog.feedly.com/2013/03/14/google-reader/">Feedly</a>: What is this? Is it a Web service? Is it a standalone software? Do I have to host it myself?</li> <li><a href="http://hivemined.org/#wut">Hivemined</a>: Not ready yet</li> <li><a href="http://www.newsblur.com/">NewsBlur</a>: I could not sign in.</li> <li><a href="https://www.rolio.com/">Rolio.com</a>: No import</li> </ul> <h2>More alternatives</h2> <p>Here is <a href="http://www.anoxa.de/blog2/?p=16012">an article</a> that lists lots of alternatives.</p> <h2>A short survey</h2> <p>I&#39;m interested in your experiences. Would you please participate in this five minute survey?</p> <iframe src="https://docs.google.com/forms/d/1m7-dKZkKGKQrn3fhejKAxMAw-rWjTR8t1hdE3-zZr-8/viewform?embedded=true" width="512" height="500" frameborder="0" marginheight="0" marginwidth="0">Wird geladen...</iframe> Myth: The Internet doesn't forget http://martin-thoma.com/myth-the-internet-doesnt-forget Thu, 14 Mar 2013 11:01:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/myth-the-internet-doesnt-forget <p>I&#39;ve created a <a href="http://www.youtube.com/watch?v=QDV4E9ldelM&list=PL1EB0B7290460E720">playlist</a> with 51 songs on YouTube about two years ago.</p> <p>Let&#39;s see the stats: <ul> <li>6 of 51 are still available</li> <li>5 had copyright problems</li> <li>17 songs are not available because of <a href="http://en.wikipedia.org/wiki/Gesellschaft_f%C3%BCr_musikalische_Auff%C3%BChrungs-_und_mechanische_Vervielf%C3%A4ltigungsrechte">GEMA</a></li> <li>22 are gone for other reasons</li> </ul></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/youtube-gema-300x134.png"><img src="../images/2013/03/youtube-gema-300x134.png" alt="" width="300" height="134" class="size-medium wp-image-60991"/></a><p class="wp-caption-text"></p></div> <table> <thead> <tr> <th>Song</th> <th>Available</th> </tr> </thead> <tbody> <tr> <td><abbr title="Metallica ...; Someday-Ni...; Metallica ...; Metallica - T...">4 songs</abbr></td> <td>This video is no longer available due to a copyright claim by WMG.</td> </tr> <tr> <td><abbr title="Cyanide - Metallic...">1 songs</abbr></td> <td>This video is no longer available due to a copyright claim by Warner Music Group.</td> </tr> <tr> <td><abbr title="I even can't see the full title of that clip">Metallica - T...</abbr></td> <td>Not available in Germany (WMG, GEMA)</td> </tr> <tr> <td><abbr title="Ebay song; Brian McFadden - Real To Me">2 songs</abbr></td> <td>Unfortunately, this SME-music-content is not available in Germany because GEMA has not granted the respective music publishing rights.</td> </tr> <tr> <td><abbr title="The Kooks - Sway">1 songs</abbr></td> <td>Unfortunately, this SME-music-content is not available in Germany because GEMA has not granted the respective music publishing rights.</td> </tr> <tr> <td><abbr title="Within Temptation - Running up that hill; Warlock - F&uuml;r Immer; Smells Like Teen Spirit Misheard; Metallica - Master Of Puppets; The Rasmus - Livin' in a world without you; The Fratellis - (13) Nobody's Favourite Actor; The Fratellis - My Friend John; Blink 182 - All The Small Things; Blink-182 - What's My Age Again?">9 songs</abbr></</td> <td>[...] UMG-music-content is not available in Germany because GEMA [...]</td> </tr> <tr> <td><abbr title="Nickelback - Rockstar; Nickelback - Far Away">2 song</abbr></td> <td>Unfortunately, this video is not available in Germany because it may contain music for which GEMA has not granted the respective music rights.</td> </tr> <tr> <td><abbr title="Nightwish - Kinslayer; Wishmaster - The Misheard">2 songs</abbr></</td> <td>This video is not available in your country.</td> </tr> <tr> <td><abbr title="I can't see the title of those clips.">11 song</abbr></td> <td>This video is no longer available because the YouTube account associated with this video has been terminated. </td> </tr> <tr> <td><abbr title="I even can't see the title of that clip">3 songs</abbr></td> <td>This video is unavailable.</td> </tr> <tr> <td><abbr title="I even can't see the title of that clip">2 songs</abbr></td> <td>content violated YouTube's Terms of Service</td> </tr> <tr> <td><abbr title="I even can't see the title of those clips">2 songs</abbr></td> <td>This video has been removed by the user.</td> </tr> <tr> <td><abbr title="I even can't see the title of that clip"> 4 songs</abbr></td> <td>This video is private.</td> </tr> <tr> <td>Cheney's Got A Gun</td> <td><a href="http://www.youtube.com/watch?v=7fcYKVj23FU">Available</a>!</td> </tr> <tr> <td>My Favorite Things</td> <td><a href="http://www.youtube.com/watch?v=6C48AMyV64Q">Available</a>!</td> </tr> <tr> <td>Osama Bin Laden Song</td> <td><a href="http://www.youtube.com/watch?v=46OMP4SQCu0">Available</a>!</td> </tr> <tr> <td>Harry Potter Parody Song: Stay - Katy Cartee Haile</td> <td><a href="http://www.youtube.com/watch?v=eEyHtrmNbCs">Available</a>!</td> </tr> <tr> <td>Wii 'Fat' Song</td> <td><a href="http://www.youtube.com/watch?v=pDe7MPPZYgE">Available</a>!</td> </tr> <tr> <td>Billy Talent - Fallen Leaves</td> <td><a href="http://www.youtube.com/watch?v=UJZYKdLJljQ">Available</a>!</td> </tr> </tbody> </table> Nexus 4 http://martin-thoma.com/nexus-4 Sun, 10 Mar 2013 11:52:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/nexus-4 <h2>Buying it</h2> <p>You can buy a Nexus 4 in <a href="http://en.wikipedia.org/wiki/Saturn_(store)">Saturn</a>, but the 16GB-version costs 395 Euro there (<a href="http://www.saturn.de/mcs/product/LG-Nexus-4-16-GB,48352,365082,523287.html?langId=-3">source</a>). In Google Play Store, it costs &quot;only&quot; 349 Euro (<a href="https://play.google.com/store/devices/details/Nexus_4_16GB?id=nexus_4_16gb">source</a>). </p> <h3>Comdirect</h3> <p>So, I&#39;ve decided to buy it from Google Play Store. But you have to have a <a href="http://www.google.de/wallet/">Google Wallet</a> account to use it. For a Google Wallet account, you need a credit card. Unlike in the USA, most people in Germany don&#39;t have a credit card. I had to get one and decided to use the free one from <a href="http://de.wikipedia.org/wiki/Comdirect">Comdirect</a>.</p> <p>Here is a list of letters I got ... I&#39;ve expected one or two.</p> <dl> <dt>08.02.2013</dt> <dd>I sent my information for registration to comdirect</dd> <dt>15.02.2013</dt> <dd>Notice that I need to send a <a href="http://de.wikipedia.org/wiki/Meldebest%C3%A4tigung">Meldebest&auml;tigung</a> as I did identity verification with my <a href="http://commons.wikimedia.org/wiki/File:Biometrie_reisepass_deutsch.jpg">passport</a> and not with my <a href="http://en.wikipedia.org/wiki/German_identity_card">identity card</a>. The Meldebest&auml;tigung costs 8.00 Euro.</dd> <dt>21.02.2013</dt> <dd>General information like account number</dd> <dt>22.02.2013</dt> <dd>PIN for online login</dd> <dt>28.02.2013</dt> <dd>Visa-Card</dd> <dt>27.02.2013</dt> <dd><a href="http://en.wikipedia.org/wiki/Transaction_authentication_number">iTAN</a> list</dd> <dt>04.03.2013</dt> <dd>.comdirect girocard</dd> <dt>05.03.2013</dt> <dd>re-activation of bank account</dd> <dt>05.03.2013</dt> <dd>bank account blocked: three failed online logins</dd> <dt>05.03.2013</dt> <dd>PIN for <a href="http://en.wikipedia.org/wiki/Girocard">Girocard</a></dd> </dl> <div style="width: 290px" class="wp-caption aligncenter"><a href="../images/2013/03/comdirect-karten-irrsinn-290x300.jpg"><img src="../images/2013/03/comdirect-karten-irrsinn-290x300.jpg" alt="" width="290" height="300" class="size-medium wp-image-60371"/></a><p class="wp-caption-text"></p></div> <p>At 28.02.2013, I first transferred 5 Euro to check if everything works as expected. I have to transfer it to my girocard. It arrived at 01.03.2013. Then I have to transfer it to my Visa card. It arrived at 04.03.2013. Quite a long time for an internal transaction.</p> <p>As I made three attempts to login into my online account from comdirect bank, my account was locked. I had to send a fax and ask them to unlock my account! Another Euro for the fax. (By the way, I think this is a security leak. If I wanted to do harm to the bank, I could make lots of accesses to their customers accounts and lock them. I guess it wouldn&#39;t take me more than 30 minutes to write the code and about one day to let it run. Very bad.)</p> <h3>Google Play</h3> <p>Ok, I&#39;ve got a credit card. Now I will have bought a Nexus 4 in a couple of minutes, right? Wrong.</p> <p>[gallery size=&quot;medium&quot; columns=&quot;2&quot; ids=&quot;59861,59851,59841&quot;]</p> <p>What the hell? They think I live in Helgoland or have military address?</p> <p>Ok, let&#39;s try it again:</p> <p>[gallery size=&quot;medium&quot; columns=&quot;2&quot; ids=&quot;59931,59871&quot;]</p> <p>WTF? Although the transaction was canceled, my bank thinks it happened. I can&#39;t see the transaction in my bank account, though. According to my online bank account, I haven&#39;t reached my limit. But I cannot pay for the &quot;second&quot; phone. That sucks.</p> <p>The next day it worked:</p> <p>[gallery size=&quot;medium&quot; columns=&quot;2&quot; ids=&quot;59901,59911,59921&quot;]</p> <p>2013-03-07: Now I have to wait for the phone.</p> <p>2013-03-08: Hurray, it&#39;s here!</p> <p>My old not-so-smart phone and my new Nexus 4:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/nexus-4-motorola-300x298.jpg"><img src="../images/2013/03/nexus-4-motorola-300x298.jpg" alt="" width="300" height="298" class="size-medium wp-image-60091"/></a><p class="wp-caption-text"></p></div> <h2>Micro-SIM vs. Mini-SIM</h2> <p>Did you know that different SIM cards exist? I didn&#39;t. I&#39;ve learned that I have a Mini-SIM, but you need a Micro-SIM for the Nexus 4. </p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/gsm-sim-card-evolution-300x93.png"><img src="../images/2013/03/gsm-sim-card-evolution-300x93.png" alt="" width="300" height="93" class="size-medium wp-image-60011"/></a><p class="wp-caption-text"></p></div> <p>I use a pre-paid card from <a href="http://en.wikipedia.org/wiki/Simyo">simyo</a>. Currently, they offer a free exchange of Mini-SIM-cards to Micro-SIM or Nano-SIM:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/simyo-2013-03-08-1912-300x217.png"><img src="../images/2013/03/simyo-2013-03-08-1912-300x217.png" alt="" width="300" height="217" class="size-medium wp-image-60021"/></a><p class="wp-caption-text"></p></div> <p>Phew! I was lucky. </p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/simyo-sim-karte-300x192.jpg"><img src="../images/2013/03/simyo-sim-karte-300x192.jpg" alt="" width="300" height="192" class="size-medium wp-image-61041"/></a><p class="wp-caption-text"></p></div> <p>The Micro-SIM-card arrived at 2013-03-14 and will be unlocked the next day.</p> <h2>Beginners questions</h2> <div class="question"> <span class="question">What do those small icons on the top mean?</span> <div class="answer"> Those icons are the notifications. Hold your finger on the top bar and pull down. Now you can view / clear them. </div> <p></div></p> <div class="question"> <span class="question">How can I close apps?</span> <div class="answer">See <a href="http://www.technipages.com/galaxy-nexus-how-to-close-apps.html">this answer</a>.</div> </div> <div class="question"> <span class="question">How do I remove widgets?</span> <div class="answer"> <ol> <li>Go to your home screen</li> <li>Leave your finger on the widget for three seconds</li> <li>Move your finger to the appearing "remove"</li> </ol> </div> <p></div></p> <div class="question"> <span class="question">How do I open a shell?</span> <div class="answer"> Install <a href="https://play.google.com/store/apps/details?id=jackpal.androidterm">Android Terminal Emulator</a>. (It says quite often "Permission denied") </div> <p></div></p> <div class="question"> <span class="question">How can I execute Python?</span> <div class="answer"> Install <a href="https://play.google.com/store/apps/details?id=com.hipipal.qpyplus">QPython+ (Android Python)</a>. (WARNING: This seems to be a beta.) </div> <p></div></p> <div class="question"> <span class="question">How can I take screenshots on my Nexus 4?</span> <div class="answer"> Press "Volume down" and "Power" at the same time: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/how-to-take-screenshot-nexus-4-300x288.jpg"><img src="../images/2013/03/how-to-take-screenshot-nexus-4-300x288.jpg" alt="" width="300" height="288" class="size-medium wp-image-60181"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">How can I enable Geolocations for my photos?</span> <div class="answer"> [gallery size="medium" ids="60231,60201"] </div> <p></div></p> <h2>Experiments with Nexus 4</h2> <h3>Photo-Sphere</h3> <p>You can create <a href="http://www.androidcentral.com/check-out-these-awesome-photo-sphere">awesome photos</a> with photo sphere. But objects have to be not very close.</p> <p>Here is my first try with my room:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/my-room-2013-03-08-300x150.jpg"><img src="../images/2013/03/my-room-2013-03-08-300x150.jpg" alt="" width="300" height="150" class="size-medium wp-image-60051"/></a><p class="wp-caption-text"></p></div> <p>[sphere 60051]</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/Karlsruhe-Panorama_2013-03-09_0930-300x118.jpg"><img src="../images/2013/03/Karlsruhe-Panorama_2013-03-09_0930-300x118.jpg" alt="" width="300" height="118" class="size-medium wp-image-60701"/></a><p class="wp-caption-text"></p></div> <p>[sphere 60701]</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/Karlsruhe-Panorama_2013-03-09_0951-300x121.jpg"><img src="../images/2013/03/Karlsruhe-Panorama_2013-03-09_0951-300x121.jpg" alt="" width="300" height="121" class="size-medium wp-image-60431"/></a><p class="wp-caption-text"></p></div> <p>[sphere 60431]</p> <p>At the moment, it is not simply possible to include a sphere into a WordPress blog. <a href="https://github.com/kennydude/photosphere">Code</a> was published to create this effect and <a href="http://kennydude.github.com/photosphere/test.html">it works</a>, but <a href="http://wordpress.org/extend/plugins/wp-photo-sphere/">the WordPress plugin</a> has <a href="http://wordpress.org/support/plugin/wp-photo-sphere">some issues</a>.</p> <p>By the way, you can directly create a tiny world image from a photo sphere: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/karlsruhe-tiny-world-300x300.jpg"><img src="../images/2013/03/karlsruhe-tiny-world-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-60551"/></a><p class="wp-caption-text"></p></div></p> <h3>Adding a nicer alarm</h3> <p>One reason why I bought this phone was that my alarm clock (which is my old phone) is awful. <a href="http://www.zedge.net/ringtones/6067/google-nexus-4-ringtones/0-6-1/">zedge.net</a> seems to be one place where you can get ring tones. I like <a href="http://goo.gl/8c36v">Sintels song</a>, which was in Google Music.</p> <p>I&#39;ve installed <a href="https://play.google.com/store/apps/details?id=com.angryredplanet.android.rings_extended">Rings Extended</a>, as I wasn&#39;t able to find the ringtone without it. That could be better.</p> <h3>Sky Map</h3> <p>As my phone as quite a lot of sensors (GPS, compass, altimeter) I guessed it might be possible to store the well-known stars and show them on the device when you look in their direction. The app is calles &quot;<a href="https://play.google.com/store/apps/details?id=com.google.android.stardroid&hl=en">Sky Map</a>&quot;. I have to try that when the sky is clear.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/android-sky-map-300x180.png"><img src="../images/2013/03/android-sky-map-300x180.png" alt="" width="300" height="180" class="size-medium wp-image-60261"/></a><p class="wp-caption-text"></p></div> <h3>Movies</h3> <p>I was very surprised that they don&#39;t have <a href="../blender-open-movies/">Blender Open Movies</a> in the movie section of play store :-(</p> <h3>MyTracks</h3> <p>MyTracks lets you record the track you take and see some stats about that. Quite nice, but the export doesn&#39;t work.</p> <p>I filed my first bug / feature request for an app: <a href="https://code.google.com/p/mytracks/issues/detail?id=1260">Issue 1260</a></p> <h2>What it replaces</h2> <p>Nexus 4 could replace quite a lot of stuff: <div style="width: 295px" class="wp-caption aligncenter"><a href="../images/2013/03/what-nexus-4-could-replace-295x300.jpg"><img src="../images/2013/03/what-nexus-4-could-replace-295x300.jpg" alt="" width="295" height="300" class="size-medium wp-image-60531"/></a><p class="wp-caption-text"></p></div></p> <p>But it can&#39;t replace credit cards in Germany as NFC isn&#39;t supported by the shops by now. It can&#39;t really replace a camera as the quality is ugly. Just take a close look at the photo above. This was taken with Nexus 4. Sadly, if you don&#39;t install apps like <a href="https://play.google.com/store/apps/details?id=com.sand.airdroid">AirDroid</a>, it can&#39;t replace a USB stick or a MP3 player. Yes, you can use Google Music and that works, but I would like to be able to copy MP3s from my laptop computer to my smartphone. Directly. With a USB-cable and without having to use the internet. It does replace a notepad, if you only use it for writing texts and not for drawing or math. And, finally, at the moment it doesn&#39;t even replace my old phone because of the SIM-problem I&#39;ve explained above. But as soon as this is fixed, the Nexus 4 will replace my Motorola W156.</p> <p>Here is a comparision of those phones: <table> <thead> <th>&nbsp;</th> <th>Nexus 4</th> <th>Motorola W156</th> </thead> <tbody> <tr> <td>Display</td> <td>4.7 in (120 mm) diagonal IPS<br/>1280&times;768 px (316 ppi)</td> <td>1.6 in (40 mm) diagonal<br/>128&times;128 pixel</td> </tr> <tr> <td>Colors</td> <td>16 777 216</td> <td>2</td> </tr> <tr> <td>Memory</td> <td>16 GB</td> <td>20 kb (<a href="http://motorolafans.cz/en/phones/motorola-w156.php">source</a>)</td> </tr> <tr> <td>Body</td> <td>133.9 x 68.7 x 9.1 mm</td> <td>114 x 43 x 14 mm</td> </tr> <tr> <td>Weight</td> <td>139 g</td> <td>85 g</td> </tr> <tr> <td>Stand-by time</td> <td>390 hours</td> <td>465 hours</td> </tr> <tr> <td>Battery</td> <td>2100 mAh (Li - Polymer)</td> <td>940 mAh (Li - Ion)</td> </tr> </tbody> </table></p> <p>Here is the <a href="http://www.phonearena.com/phones/compare/Motorola-W156,Google-Nexus-4/phones/2435,7531">source</a> for that comparison.</p> <p>What it hopefully really replaces are maps. I&#39;ve just downloaded maps for the center of Paris. That were only about 2 MB. Here is a screenshot of maps guidance in action:</p> <div style="width: 180px" class="wp-caption aligncenter"><a href="../images/2013/03/google-maps-on-nexus-4-in-action-180x300.png"><img src="../images/2013/03/google-maps-on-nexus-4-in-action-180x300.png" alt="" width="180" height="300" class="size-medium wp-image-60561"/></a><p class="wp-caption-text"></p></div> <h2>Conclusion</h2> <p>I finally paid 358,99 Euro for the phone and shipping, 8 Euro for the &quot;Meldebest&auml;tigung&quot; and 1 Euro for the fax to re-activate my bank account which is 367,99 Euro in total. But if you want to experiment with a high quality smart phone, I guess it&#39;s a good choice.</p> <h2>What's next?</h2> <p>I have some ideas for apps. So my next steps are:</p> <ol> <li>Kick Windows 7 and <a href="https://wiki.archlinux.org/index.php/Installation_Guide">install Arch Linux</a> as the implementation / QA for PSE is over</li> <li><a href="http://developer.android.com/training/index.html">Start developing apps</a></li> <li><a href="http://developer.android.com/distribute/googleplay/publish/register.html">Get Started with Publishing</a></li> </ol> <p>I guess I&#39;ll also write an article what could get improved in Android.</p> Add a new font to ImageMagick http://martin-thoma.com/add-a-new-font-to-imagemagick Wed, 06 Mar 2013 22:15:26 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/add-a-new-font-to-imagemagick <p>You can list all fonts that are known to ImageMagick by <code>identify -list font</code>. When your font isn&#39;t there, but it is installed, you might want to try these steps:</p> <ul> <li><code>sudo updatedb</code></li> <li>Download <a href="http://www.imagemagick.org/Usage/scripts/imagick_type_gen">imagick_type_gen</a></li> <li>Execute it: <code>perl imagick_type_gen > types.xml</code></li> <li>Copy the result to the folder where it should be <ul> <li><code>locate type.xml</code>. That was <em>/usr/lib/ImageMagick-6.5.7/config/type.xml</em> for me</li> <li><code>sudo cp type.xml /usr/lib/ImageMagick-6.5.7/config/type.xml</code></li> </ul> </li> </ul> <p>You can find some nice fonts <a href="http://www.losttype.com/browse/">here</a>.</p> LaTeX Beamer http://martin-thoma.com/latex-beamer Tue, 05 Mar 2013 10:25:20 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/latex-beamer <p>I really enjoy creating presentations with LaTeX. The reasons are:</p> <ul> <li>You can use versioning (GIT, SVN, ...)</li> <li>You can use your favorite editor!</li> <li>When you've created an animation with Ti<em>k</em>Z, you can easily go one step back an go through it as fast as it is apropriate!</li> <li>Good separation of presentation and content</li> <li>It compiles to PDF <ul> <li>Everybody can open it</li> <li>It always looks the same (no moved elements or hidden bullet points)</li> </ul> </li> <li>You can use math mode :-)</li> <li>No need to buy anything. It's free and OpenSource.</li> <li>A big community (<a href="http://tex.stackexchange.com/questions/tagged/beamer">StackExchange</a> and <a href="http://www.latex-community.org/forum/viewforum.php?f=3">LateX-Community</a>) helps you, when you got questions.</li> </ul> <p>I&#39;ll now introduce you to the basics of LaTeX beamer presentations. If you only look for example, please go to my <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/presentations">GitHub LaTeX Repository</a>.</p> <h2>Basics</h2> <p>This is a basic presentation:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="nb">{</span>beamer<span class="nb">}</span> <span class="k">\usetheme</span><span class="nb">{</span>Frankfurt<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>hyperref<span class="nb">}</span> <span class="k">\usepackage</span><span class="na">[utf8]</span><span class="nb">{</span>inputenc<span class="nb">}</span> <span class="c">% this is needed for german umlauts</span> <span class="k">\usepackage</span><span class="na">[english]</span><span class="nb">{</span>babel<span class="nb">}</span> <span class="c">% this is needed for german umlauts</span> <span class="k">\usepackage</span><span class="na">[T1]</span><span class="nb">{</span>fontenc<span class="nb">}</span> <span class="c">% this is needed for correct output </span> <span class="c">% of umlauts in pdf</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\title</span><span class="nb">{</span>The title of your presentation<span class="nb">}</span> <span class="k">\subtitle</span><span class="nb">{</span>A subtitle<span class="nb">}</span> <span class="k">\author</span><span class="nb">{</span>Martin Thoma<span class="nb">}</span> <span class="k">\date</span><span class="nb">{</span>25. March 2013<span class="nb">}</span> <span class="k">\subject</span><span class="nb">{</span>Computer Science<span class="nb">}</span> <span class="k">\frame</span><span class="nb">{</span><span class="k">\titlepage</span><span class="nb">}</span> <span class="k">\section</span><span class="nb">{</span>Introduction<span class="nb">}</span> <span class="k">\subsection</span><span class="nb">{</span>A subsection!<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>frame<span class="nb">}{</span>Slide title<span class="nb">}</span> Slide content <span class="k">\end</span><span class="nb">{</span>frame<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>Style</h2> <p>If you want to create nice-looking presentations like <a href="../images/2013/03/tutorium-05.pdf">this one</a> or <a href="../images/2013/03/google-presentation.pdf">that one</a>, you should probably adjust the style. Here is an overview of the default ones that LaTeX has: <a href="http://deic.uab.es/~iblanes/beamer_gallery/">Beamer theme gallery</a> or <a href="http://latex.simon04.net/">here</a>.</p> <p>The important commands for changing the appearance, that should get included just after documentclass, are:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\usetheme</span><span class="nb">{</span>Frankfurt<span class="nb">}</span> <span class="k">\usecolortheme</span><span class="nb">{</span>default<span class="nb">}</span> </code></pre></div> <p>When you&#39;re from KIT, you should use the <a href="https://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen">KIT theme</a>.</p> <p>Here are some screenshots: [gallery size=&quot;medium&quot; columns=&quot;2&quot; ids=&quot;59471,59461,59441,59451&quot;]</p> <h2>Sections and subsections</h2> <p>Take a look at the slides I&#39;ve included above. Do you notice the little bubbles at the bottom that indicate how many slides are left?</p> <p>You get the text over the bubbles with <code>\section{Your text}</code> and the bubbles with <code>frame</code>, but you need at least one <code>\subsection{bla}</code>! When you make more than one subsection, the frame-bubbles that belong to the same one get highlighted.</p> <h2>Reveal information</h2> <p>You might want to try those commands to hide and reveal information:</p> <ul> <li>\pause</li> <li>\uncover</li> <li>\visible</li> <li>\onslide and \only</li> </ul> <p>You can use it like this:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\begin</span><span class="nb">{</span>frame<span class="nb">}{</span>Another title<span class="nb">}</span> Some text<span class="k">\\</span> <span class="k">\uncover</span>&lt;2-&gt;<span class="nb">{</span>Uncover me on slide 2 (-)<span class="k">\\</span><span class="nb">}</span> <span class="k">\visible</span>&lt;3-&gt;<span class="nb">{</span>visible from slide 3 on (-)<span class="k">\\</span><span class="nb">}</span> <span class="k">\only</span>&lt;4-&gt;<span class="nb">{</span>only from slide 4 (-)<span class="k">\\</span><span class="nb">}</span> <span class="k">\onslide</span>&lt;5-&gt;<span class="nb">{</span>on slide 5 and further (-)<span class="k">\\</span><span class="nb">}</span> <span class="k">\uncover</span>&lt;6&gt;<span class="nb">{</span>Uncover me on slide 6 <span class="k">\\</span><span class="nb">}</span> <span class="k">\visible</span>&lt;7&gt;<span class="nb">{</span>visible on 7<span class="k">\\</span><span class="nb">}</span> <span class="k">\only</span>&lt;8&gt;<span class="nb">{</span>only on slide 8 <span class="k">\\</span><span class="nb">}</span> <span class="k">\alt</span>&lt;8&gt;<span class="nb">{</span>I am on slide 8<span class="k">\\</span><span class="nb">}{</span>I am not on slide 8<span class="k">\\</span><span class="nb">}</span> <span class="k">\onslide</span>&lt;9&gt;<span class="nb">{</span>on slide 9<span class="k">\\</span><span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>frame<span class="nb">}</span> </code></pre></div> <p>Note that the numbers work like <code>\uncover&lt;n-m&gt;{ELEMENT}</code>. If no <code>m</code> is specified, ELEMENT is visible until end of this frame.</p> <p>When you have a list and you want to uncover it element by element, you can use this:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>&lt;+-&gt; <span class="k">\item</span> one <span class="k">\item</span> two <span class="k">\item</span> three <span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span> </code></pre></div> <h2>Blocks</h2> <p>You can use <code>block</code>, <code>exampleblock</code> or <code>alertblock</code> inside your frame:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\begin</span><span class="nb">{</span>exampleblock<span class="nb">}{</span>Test<span class="nb">}</span> This is my text. <span class="k">\end</span><span class="nb">{</span>exampleblock<span class="nb">}</span> </code></pre></div> <p>It looks like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/latex-beamer-block-300x117.png"><img src="../images/2013/03/latex-beamer-block-300x117.png" alt="" width="300" height="117" class="size-medium wp-image-59391"/></a><p class="wp-caption-text"></p></div></p> <h2>Images</h2> <p>Quite often, you want to have one big image.</p> <p>You need <code>\usepackage{graphicx}</code> in your preamble.</p> <p>This is how you get the image it:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\begin</span><span class="nb">{</span>frame<span class="nb">}{</span>My frame title<span class="nb">}</span> <span class="k">\includegraphics</span><span class="na">[width=\textwidth, height=0.8\textheight, keepaspectratio]</span><span class="nb">{</span>../relative/path/image.jpg<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>frame<span class="nb">}</span> </code></pre></div> <h2>Further reading</h2> <ul> <li><a href="../sizes-in-latex/" title="Sizes in LaTeX">Sizes in LaTeX</a></li> <li><a href="../how-to-visualize-graph-algorithms-with-latex/" title="How to visualize Graph algorithms with LaTeX">How to visualize Graph algorithms with LaTeX</a></li> <li><a href="http://www.math.umbc.edu/~rouben/beamer/beamer_guide.pdf">UMBC Beamer guide</a></li> <li><code>texdoc beameruserguide</code> or <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/beamer/doc/beameruserguide.pdf">online</a></li> </ul> Linux access rights and attributes http://martin-thoma.com/linux-access-rights-and-attributes Mon, 04 Mar 2013 21:29:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/linux-access-rights-and-attributes <h2>RWX</h2> <h3>Files</h3> <p>Linux files have three important access rights for files: <ul> <li><strong>R</strong>ead</li> <li><strong>W</strong>rite</li> <li>E<strong>x</strong>ecute</li> </ul></p> <p>If you want to mark a file as executable, you can add the x-right:</p> <div class="highlight"><pre><code class="bash">chmod +x </code></pre></div> <p>When you want to mark a file as readable, you can dd the r-right:</p> <div class="highlight"><pre><code class="bash">chmod +r </code></pre></div> <p>You can remove rights in a similar way:</p> <div class="highlight"><pre><code class="bash">chmod -x testfile </code></pre></div> <p>Now, often this is expressed numerically. Three bits determine if the file is readable (4), writable (2) or executable (1). Did you notice that all of them are powers of two? </p> <h3>Folders</h3> <p>rwx has a meaning for folders, too: <ul> <li><strong>R</strong>ead: if that is missing, you can&#39;t use <code>ls</code> in the directory.</li> <li><strong>W</strong>rite: you need this to create new files / folders in the direcotry</li> <li><strong>x</strong> ... like &quot;enter&quot;?: if that is missing, you can&#39;t enter the directory.</li> </ul></p> <h2>User, Group, Others</h2> <p>The rights above can be set for the user who created the file (sometimes also called the owner). Then the group that owns the file and all others. This is the reason why you have three times the rights from above:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Downloads<span class="sb">`</span><span class="nv">$ </span>ls -l total 29624 drwxr-xr-x 8 moose moose 4096 2013-02-22 14:18 algorithms -rw-r--r-- 1 moose moose 60058 2013-02-11 08:00 args4j-2.0.21.jar drwxr-xr-x 6 moose moose 4096 2013-02-25 20:07 bwinf -rw-r--r-- 1 moose moose 22160041 2013-02-05 16:45 DT2012.zip drwxr-xr-x 8 moose moose 4096 2013-02-28 19:23 graphentheorie -rw-r--r-- 1 moose moose 2164878 2013-02-22 12:38 guava-14.0-rc1.jar -rw-r--r-- 1 moose moose 2705344 2013-03-01 21:07 HardVacuum.zip drwxr-xr-x 8 moose moose 4096 2013-02-05 16:38 informatik-2011 -rw-r--r-- 1 moose moose 111926 2013-02-24 19:09 Jim_Keener_resume.pdf drwxr-xr-x 2 moose moose 4096 2011-11-08 11:50 juniper_linux -rw-r--r-- 1 moose moose 288666 2012-12-04 11:38 junit-4.11.jar drwxr-xr-x 13 moose moose 4096 2013-02-01 23:33 LaTeX-examples drwxr-xr-x 2 moose moose 4096 2009-08-11 17:04 otrdecoder -rw-r--r-- 1 moose moose 728292 2013-03-01 19:33 PlanetCute PNG.zip drwxr-xr-x 2 moose moose 4096 2012-11-13 10:49 ProjectEuler drwxr-xr-x 2 moose moose 4096 2013-03-04 20:28 Screenshots Matlab -rw-r--r-- 1 moose moose 764196 2013-03-04 20:28 Screenshots Matlab.zip -rw-r--r-- 1 moose moose 534614 2013-03-01 19:48 spritelib_gpl.zip drwxr-xr-x 8 moose moose 4096 2013-02-27 18:36 Team drwxr-xr-x 5 moose moose 4096 2013-02-27 19:17 ViMuDat </code></pre></div> <p>You might wonder what happens when you execute <code>chmod +x filename</code>. Does it set the execute-flag only for the user? Or for all three - user, group, others? Try and find out. You might want to remove all rights with <code>chmod 000 filename</code> before you start.</p> <p>Did you know that you can search for file permissions with <code>find /home/ -perm 777</code>?</p> <h2>SUID, SGID, Sticky Bit</h2> <h3>Files</h3> <p>Sometimes, you want to execute programs as root, although the user who started the execution isn&#39;t root. Take passwd, the program that allows users to change passwords, for example:</p> <div class="highlight"><pre><code class="bash">moose@pc07:/usr/bin<span class="nv">$`</span> ls -l <span class="p">|</span> grep passwd<span class="sb">`</span><span class="err">$</span> -rwsr-xr-x 1 root root 53812 2011-02-14 23:11 gpasswd -rwxr-xr-x 1 root root 13612 2012-11-06 21:41 htpasswd -rwsr-xr-x 1 root lpadmin 13540 2012-12-04 16:24 lppasswd -rwsr-xr-x 1 root root 37140 2011-02-14 23:11 passwd -rwxr-xr-x 1 root root 5070304 2012-04-24 23:38 smbpasswd -rwxr-xr-x 1 root root 9688 2013-01-18 17:59 vino-passwd </code></pre></div> <p>Instead of &quot;x&quot; in the user-execution-row, it states &quot;s&quot;. That means, you can execute it and it has the SUID-bit set. If &quot;x&quot; wasn&#39;t set, the &quot;S&quot; would be in a capital letter. When you change your password, you need to edit <code>/etc/shadow</code>. This file has very limited access rights: <code>-rw-r-----</code> and is owned by &quot;root&quot; and group &quot;shadow&quot;:</p> <div class="highlight"><pre><code class="bash">moose@pc07:/etc<span class="nv">$`</span> ls -l <span class="p">|</span> grep shadow<span class="sb">`</span><span class="err">$</span> -rw-r----- 1 root shadow 813 2013-01-24 06:21 gshadow -rw-r----- 1 root shadow 1274 2013-01-24 06:21 shadow </code></pre></div> <p>Here is <a href="http://www.cyberciti.biz/faq/understanding-etcshadow-file/">more about shadow file</a>.</p> <p>The SGID (set group id) bit works similar to the SUID (set user id) bit. When you want to execute something with as the group of the file, you set the SGID bit.</p> <p>The sticky bit seems to be used for programs to stick in memory after it was finished. </p> <p>You can set the sticky bit like this:</p> <div class="highlight"><pre><code class="bash">chmod +t testfile </code></pre></div> <p>or like that:</p> <div class="highlight"><pre><code class="bash">chmod 1777 testfile </code></pre></div> <h3>Folders</h3> <ul> <li>suid: is ignored on UNIX and Linux systems</li> <li>sgid: new files and subdirectories created within this folder inherit the folders group ID</li> <li>t: when the sticky bit is set, only owners may change the filename or delete files</li> </ul> <h2>Type</h2> <p>The first column of <code>ls -l</code> tells you the type of the item:</p> <ul> <li>-: a file</li> <li>b: a block device</li> <li>c: a character device</li> <li>d: a directory</li> <li>l: a symbolic link</li> <li>p: pipe</li> <li>s: a socket</li> </ul> <div class="highlight"><pre><code class="bash">moose@pc07:/dev<span class="nv">$`</span> ls -l total 0 crw------- 1 root video 10, 175 2013-03-04 10:01 agpgart crw-rw----+ 1 root audio 14, 4 2013-03-04 10:01 audio drwxr-xr-x 2 root root 640 2013-03-04 12:59 block drwxr-xr-x 2 root root 100 2013-03-04 12:59 bsg drwxr-xr-x 3 root root 60 2013-03-04 10:01 bus lrwxrwxrwx 1 root root 3 2013-03-04 10:01 cdrom -&gt; sr0 lrwxrwxrwx 1 root root 3 2013-03-04 10:01 cdrw -&gt; sr0 crw-rw----+ 1 root audio 14, 3 2013-03-04 10:01 dsp lrwxrwxrwx 1 root root 3 2013-03-04 10:01 dvd -&gt; sr0 lrwxrwxrwx 1 root root 3 2013-03-04 10:01 dvdrw -&gt; sr0 crw-rw---- 1 root root 10, 61 2013-03-04 10:01 ecryptfs crw-rw---- 1 root video 29, 0 2013-03-04 10:01 fb0 lrwxrwxrwx 1 root root 13 2013-03-04 10:01 fd -&gt; /proc/... crw-rw-rw- 1 root root 1, 7 2013-03-04 10:01 full crw-rw-rw- 1 root fuse 10, 229 2013-03-04 10:01 fuse crw-rw---- 1 root root 251, 0 2013-03-04 18:14 hidraw0 crw-rw---- 1 root root 10, 228 2013-03-04 10:01 hpet drwxr-xr-x 4 root root 380 2013-03-04 18:14 input crw-rw---- 1 root root 1, 11 2013-03-04 10:01 kmsg srw-rw-rw- 1 root root 0 2013-03-04 10:01 log brw-rw---- 1 root disk 7, 0 2013-03-04 10:01 loop0 <span class="o">[</span>...<span class="o">]</span> </code></pre></div> <h2>stat</h2> <p>You can display quite a lot of information of a file with stat:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop/Test<span class="sb">`</span><span class="nv">$ </span>stat testfile File: <span class="sb">`</span>testfile<span class="err">&#39;</span> Size: 13 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 923339 Links: 1 Access: <span class="o">(</span>0777/-rwxrwxrwx<span class="o">)</span> Uid: <span class="o">(</span> 1000/ moose<span class="o">)</span> Gid: <span class="o">(</span> 1000/moose<span class="o">)</span> Access: 2013-03-04 21:31:52.154187243 +0100 Modify: 2013-03-04 21:31:51.154184098 +0100 Change: 2013-03-04 21:31:51.154184098 +0100 </code></pre></div> <p>The content of the file is &quot;Hello World.&quot; (12 characters)</p> <h2>Attributes</h2> <p>According to the manpage of chattr:</p> <blockquote>The `c', 's', and `u' attributes are not honored by the ext2 and ext3 filesystems as implemented in the current mainline Linux kernels. These attributes may be implemented in future versions of the ext2 and ext3 filesystems.</blockquote> <h3>Version</h3> <p>I&#39;ve just learned that you can give files version-attributes:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop/Test<span class="nv">$`</span> lsattr -v 1338 -----------------e- ./testfile </code></pre></div> <p>You can set the version like this:</p> <div class="highlight"><pre><code class="bash">chattr -v 1339 testfile </code></pre></div> <h3>Append only</h3> <p>This one is weird. Theoretically, it should allow me to append to a file, but not to change / delete anything in the file. </p> <p>First of all, I had to use sudo to add this attribute:</p> <div class="highlight"><pre><code class="bash">sudo chattr +a testfile </code></pre></div> <p>Then, I had all permissions:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop/Test<span class="sb">`</span><span class="nv">$ </span>stat testfile File: <span class="sb">`</span>testfile<span class="err">&#39;</span> Size: 13 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 923339 Links: 1 Access: <span class="o">(</span>0777/-rwxrwxrwx<span class="o">)</span> Uid: <span class="o">(</span> 1000/ moose<span class="o">)</span> Gid: <span class="o">(</span> 1000/moose<span class="o">)</span> Access: 2013-03-04 21:31:52.154187243 +0100 Modify: 2013-03-04 21:31:51.154184098 +0100 Change: 2013-03-04 21:33:55.154184312 +0100 moose@pc07:~/Desktop/Test<span class="nv">$`</span> lsattr -----a-----------e- ./testfile </code></pre></div> <p>But I couldn&#39;t append to the file with gedit. With bash, it worked fine:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop/Test<span class="sb">`</span><span class="nv">$ </span><span class="nb">echo</span> <span class="s2">&quot;One more line &quot;</span> &gt;&gt; testfile moose@pc07:~/Desktop/Test<span class="nv">$`</span> cat testfile Hello World. One more line </code></pre></div> <p>So I guess I found another bug in gEdit.</p> <h3>Immutable</h3> <p>You can mark a file as immutable with <code>sudo chattr +i testfile</code>. It&#39;s funny, you can&#39;t see that with <code>ls -l</code>, you have to use <code>lsattr</code>. I guess if you manage to get root privileges and want to troll somebody, you could set this bit. I think this might take quite a while until you recognize it.</p> <h3>Secure deletion and undeletable</h3> <p>When secure deletion is set with <code>chattr +s testfile</code> the operating system overwrites the file with random data when it is deleted.</p> <p><code>chattr +u testfile</code> makes your file undeletable. This is strange. You can still delete the file with <code>rm</code>, but the system will not overwrite it. I&#39;ve just <a href="http://unix.stackexchange.com/q/66870/4784">asked a question on SE</a>.</p> <h3>Synchronous update</h3> <p>when you set <code>chattr +S testfile</code> the file gets directly written to the HDD and not buffered by the kernel cache.</p> Check File Systems maximum path depth http://martin-thoma.com/check-file-systems-maximum-path-depth Sun, 03 Mar 2013 19:51:24 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/check-file-systems-maximum-path-depth <p>Today, I&#39;ve wondered how deep a path could be at maximum. I&#39;ve guessed the file system may be limiting that, but perhaps also some tools that I use for basic operations like listing a folders contents would fail before. So I&#39;ve created the following C-Snippet to test it:</p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;sys/stat.h&gt;</span> <span class="cp">#include &lt;sys/types.h&gt;</span> <span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;string.h&gt;</span> <span class="cp">#include &lt;stdlib.h&gt;</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">int</span> <span class="n">returnCode</span><span class="p">;</span> <span class="kt">char</span> <span class="o">*</span><span class="n">pathname</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">giveInformation</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;return code</span><span class="se">\t\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">returnCode</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Created sub-directories</span><span class="se">\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;length of pathname</span><span class="se">\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">));</span> <span class="k">if</span> <span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">80</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Path</span><span class="se">\t\t\t</span><span class="s">: %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pathname</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span> <span class="n">pathname</span> <span class="o">=</span> <span class="s">&quot;/home/moose/Desktop/Test&quot;</span><span class="p">;</span> <span class="kt">char</span> <span class="o">*</span><span class="n">ext</span> <span class="o">=</span> <span class="s">&quot;/one&quot;</span><span class="p">;</span> <span class="n">returnCode</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">int</span> <span class="n">maxDir</span> <span class="o">=</span> <span class="mi">1000000</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">maxDir</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">returnCode</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="kt">char</span> <span class="o">*</span><span class="n">newName</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span><span class="o">+</span><span class="n">strlen</span><span class="p">(</span><span class="n">ext</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">newName</span><span class="p">,</span> <span class="n">pathname</span><span class="p">);</span> <span class="n">strcat</span><span class="p">(</span><span class="n">newName</span><span class="p">,</span> <span class="n">ext</span><span class="p">);</span> <span class="n">returnCode</span> <span class="o">=</span> <span class="n">mkdir</span><span class="p">(</span><span class="n">newName</span><span class="p">,</span> <span class="mo">0777</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// if you remove this line, your system gets very slow:</span> <span class="n">free</span><span class="p">(</span><span class="n">pathname</span><span class="p">);</span> <span class="p">}</span> <span class="n">pathname</span> <span class="o">=</span> <span class="n">newName</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">giveInformation</span><span class="p">();</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Now run it:</p> <div class="highlight"><pre><code class="bash"><span class="sb">`</span><span class="nv">$ </span><span class="nb">time</span> ./createDirectories <span class="k">return </span>code : -1 Created sub-directories : 1018 length of pathname : 4096 real 0m0.281s user 0m0.004s sys 0m0.180s </code></pre></div> <p>Ok, something went wrong at the end. Lets see what crashes when I enter this path in Gnome terminal</p> <div class="highlight"><pre><code class="bash"><span class="nv">$`</span> <span class="nb">cd </span>one/one/one .... one/ <span class="sb">`</span><span class="nv">$ </span>mkdir two <span class="nv">$`</span> <span class="nb">cd </span>two <span class="nb">cd</span>: error retrieving current directory: getcwd: cannot access parent directories: File name too long </code></pre></div> <p>Strangely, it showed me a path <code>/home/moose/.../one/one/one/one/tw`$</code>. No, this is not a typo. It showed tw, not two. So, maybe the path can get only that long? Now I created a folder called &quot;three&quot; and one called &quot;this&quot;. I entered both of them with cd, both showed <code>/home/moose/.../one/one/th</code>. So I guess this is a problem of Gnome Terminal and not a limitation of the file system.</p> <p>Let&#39;s see what Nautilus does. I <a href="../cyclic-references-kill-nautilus/" title="Cyclic references kill Nautilus">once got Nautilus to crash</a>, I think I get it another time:</p> <p>Contents, according to nautilus: <code>1,016 items, totalling 4.0 MB</code></p> <p>Then I&#39;ve opened the folder &quot;one&quot; and double clicked as fast as I could. CPU utilization: 100%, but no crash. And 995 items are left :-) Now a single double click causes 100% CPU utilization for about 25 seconds.</p> <p>When I use a single character for sub-directories, I get:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop/Test<span class="nv">$`</span> ./createDirectories <span class="k">return </span>code : -1 Created sub-directories : 2036 length of pathname : 4096 </code></pre></div> <h2>Number of directories in one directory</h2> <p>Do you know how many folders can fit into one folder? Well, lets find out:</p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;sys/stat.h&gt;</span> <span class="cp">#include &lt;sys/types.h&gt;</span> <span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;string.h&gt;</span> <span class="cp">#include &lt;stdlib.h&gt;</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">int</span> <span class="n">returnCode</span><span class="p">;</span> <span class="kt">char</span> <span class="o">*</span><span class="n">pathname</span><span class="p">;</span> <span class="cm">/** http://stackoverflow.com/a/440240/562769 */</span> <span class="kt">void</span> <span class="nf">gen_random</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">len</span><span class="p">)</span> <span class="p">{</span> <span class="k">static</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">alphanum</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;0123456789&quot;</span> <span class="s">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;</span> <span class="s">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">alphanum</span><span class="p">[</span><span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">alphanum</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)];</span> <span class="p">}</span> <span class="n">s</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">giveInformation</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;return code</span><span class="se">\t\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">returnCode</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Created sub-directories</span><span class="se">\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;length of pathname</span><span class="se">\t</span><span class="s">: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">));</span> <span class="k">if</span> <span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">80</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Path</span><span class="se">\t\t\t</span><span class="s">: %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pathname</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span> <span class="n">pathname</span> <span class="o">=</span> <span class="s">&quot;/home/moose/Desktop/Test/test/&quot;</span><span class="p">;</span> <span class="n">returnCode</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">int</span> <span class="n">maxDir</span> <span class="o">=</span> <span class="mi">1000000</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">maxDir</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">returnCode</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// get unique name</span> <span class="kt">char</span> <span class="o">*</span><span class="n">foldername</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">50</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> <span class="n">gen_random</span><span class="p">(</span><span class="n">foldername</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span> <span class="kt">char</span> <span class="o">*</span><span class="n">completePath</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span> <span class="o">+</span><span class="n">strlen</span><span class="p">(</span><span class="n">foldername</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">completePath</span><span class="p">,</span> <span class="n">pathname</span><span class="p">);</span> <span class="n">strcat</span><span class="p">(</span><span class="n">completePath</span><span class="p">,</span> <span class="n">foldername</span><span class="p">);</span> <span class="n">returnCode</span> <span class="o">=</span> <span class="n">mkdir</span><span class="p">(</span><span class="n">completePath</span><span class="p">,</span> <span class="mo">0777</span><span class="p">);</span> <span class="n">free</span><span class="p">(</span><span class="n">foldername</span><span class="p">);</span> <span class="n">free</span><span class="p">(</span><span class="n">completePath</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">giveInformation</span><span class="p">();</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>I&#39;ve executed it and after eight minutes I canceled the execution.</p> <div class="highlight"><pre><code class="bash"><span class="nv">$ </span>ls <span class="p">|</span> wc -l 378463 </code></pre></div> <p>Ok, not a million folders, but 378.463 is also quite a lot. When I try to open this folder with Nautilus, I get 140% CPU utilization by Nautilus. Quite impressive, for only showing some folders.</p> <p>You should probably not execute the script above, as <a href="http://unix.stackexchange.com/q/66806/4784">deleting the folder isn&#39;t that easy</a>.</p> <p>By the way, I got a new error message that I didn&#39;t know before:</p> <div style="width: 498px" class="wp-caption aligncenter"><a href="../images/2013/03/cannot-move-to-trash-filename.png"><img src="../images/2013/03/cannot-move-to-trash-filename.png" alt="" width="498" height="269" class="size-full wp-image-58951"/></a><p class="wp-caption-text"></p></div> Betriebssysteme Klausur http://martin-thoma.com/os-klausur Sat, 02 Mar 2013 18:06:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/os-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesungen des Moduls &bdquo;Betriebssysteme&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Prof. Dr. Belosa und sp&auml;ter bei Prof. Dr. Beigl geh&ouml;rt.</div> <p>Wenn ich im Folgenden eine Seitenzahl angebe, dann ist damit &quot;Operating System Concepts&quot; von Silberschatz gemeint (ISBN 0-471-69466-5):</p> <h2>Themen</h2> <ul> <li>Process Coordination: <ul> <li>Shared Memory</li> <li>Critical-Section Problem: <a href="http://de.wikipedia.org/wiki/Algorithmus_von_Peterson">Peterson's Solution</a>, Synchronisation</li> <li><a href="http://de.wikipedia.org/wiki/Deadlock">Deadlock</a>, <a href="http://en.wikipedia.org/wiki/Resource_starvation">Starvation</a></li> </ul> </li> <li>Process Management <ul> <li>Process Sheduling</li> <li>Process States: new, ready, running, waiting, terminated</li> <li>Process Control Block: Folie 6/65 slide_proc_management</li> </ul> </li> <li>Memory Management <ul> <li>Globale / lokale Seitenersetzungsstrategie</li> <li>Equal allocation</li> <li><a href="http://de.wikipedia.org/wiki/Slab_allocator">Slab allocator</a></li> </ul> </li> </ul> <h2>Begriffe</h2> <p>Folgende Begriffe muss man kennen und erkl&auml;ren k&ouml;nnen: <ul> <li>Critical Section und Race Condition</li> <li><a href="http://de.wikipedia.org/wiki/Semaphor_(Informatik)">Semaphor</a>: counting Semaphores, binary Semaphores und Mutex Locks &rarr; Antwort auf S. 200f</li> <li>Dining-Philosophers Problem &rarr; Antwort auf S. 207f</li> <li>Deadlock, Starvation</li> <li>Safe State</li> </ul></p> <h2>FAQ</h2> <ul> <li>Wie funktionieren Bitmasken und insbesondere ~, &, |?</li> <li>Nenne ein reales Beispiel, bei dem eine Race-Condition auftreten k&ouml;nnte.</li> <li>Welche Probleme hat Contiguous Allocation? &rarr; <span class="hint" title="Man muss sich entscheiden, wo auf der Festplatte eine neue Datei begonnen werden soll; Externe Fragmentierung. Strategien: First Fit, Best Fit, Worst Fit">Antwort</span></li> </ul> <div class="question"> <span class="question">Welche Scheduling-Verfahren gibt es?</span> <div class="answer"> <ul> <li>Priority Scheduling</li> <li>Round Robin</li> <li>Multilevel Feedback Queue</li> <li>Lottery Scheduling</li> <li><abbr title="Preemtitive Shortest Job First">PSJF</abbr></li> <li><abbr title="First Come, First Serve">FCFS</abbr></li> </ul></div> </div> <div class="question"> <span class="question">What is the difference between Page and Frame?</span> <div class="answer">In a paging system, programs and data stored on disk are divided into equal, fixed sized blocks called pages, and main memory is divided into blocks of the same size called frames. Exactly one page can fit in one frame. Physical memory is divided into parts called &bdquo;frame&ldquo; and logical memory is divided into parts called &bdquo;page&ldquo;.</div> Quelle: <a href="http://wiki.answers.com/Q/What_is_the_difference_between_Page_and_Frame">wiki.answers.com</a> </div> <div class="question"> <span class="question">Nennen und erl&auml;utern Sie die drei notwendigen Bedingungen f&uuml;r eine g&uuml;ltige L&ouml;sung des Problems kritischer Abschnitte.</span> <div class="answer"> <ul> <li>Mutual exclusion: Only one thread can be in the CS at a time.</li> <li>Progress: <ul> <li>If no thread is in the CS one of the threads trying to enter will eventually get in</li> <li>Threads that are not trying to enter do not hinder processes that try to enter from getting in</li> </ul> </li> <li>Bounded waiting: Once a thread starts trying to enter the critical section, there is a bound on the number of times other threads get in.</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Wie kann man das Problem kritischer Abschnitte l&ouml;sen?</span> <div class="answer"> <ul> <li>Interrupts deaktivieren (nur im Kernel-Space, nur Single-Core)</li> <li>Spezielle atomare Instruktionen: <ul> <li><a href="http://en.wikipedia.org/wiki/Test-and-set">Test-and-set</a></li> <li><a href="http://en.wikipedia.org/wiki/Compare-and-swap">Compare-and-swap</a></li> <li><a href="http://en.wikipedia.org/wiki/Fetch-and-add">Fetch-and-add</a></li> <li><a href="http://en.wikipedia.org/wiki/Swap_(computer_science)#Dedicated_instructions">swap</a></li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Semaphor_(Informatik)">Semaphor</a> (wait und signal)</li> <li><a href="http://de.wikipedia.org/wiki/Monitor_(Informatik)">Monitor</a></li> <li><a href="http://de.wikipedia.org/wiki/Algorithmus_von_Peterson">Algorithmus von Peterson</a></li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Nennen und erkl&auml;ren Sie die ver notwendigen Bedingungen f&uuml;r Deadlocks.</span> <div class="answer"> <ul> <li>Mutual exclusion: Eine Ressource kann nicht gleichzeitig von mehreren Prozessen benutzt werden</li> <li>Hold and wait: Ein Prozess, der bereits mindestens eine Ressource h&auml;lt, wartet auf mindestens eine andere Ressource</li> <li>No preemption: Zugeteilte Ressourcen k&ouml;nnen einem Prozess nicht wieder entzogen werden. Er muss diese selbst freigeben.</li> <li>Circular wait: Es gibt eine Menge von Prozessen `$\{P_0, P_1, \dots, P_n\}$`, wobei `$P_0$` auf eine Ressource wartet, die `$P_1$` h&auml;lt, `$P_1$` auf eine Ressource wartet, die `$P_2$` h&auml;lt, ..., `$P_n$` auf eine Ressource wartet, die `$P_0$` h&auml;lt.</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Was kann man in Bezug auf das Deadlock-Problem machen?</span> <div class="answer"> <ul> <li>Prevention</li> <li>Avoidance</li> <li>Detection: <ul> <li>Prozess abschie&szlig;en</li> <li>Rollback</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Vogel-Strau%C3%9F-Algorithmus">Vogel-Strau&szlig;-Algorithmus</a>: Der User wird sich schon drum k&uuml;mmern, z.B. indem er einen Prozess abschie&szlig;t (<code>kill -9</code>) oder indem er den PC vom Strom nimmt.</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Erkl&auml;ren Sie Raid 0 - 5.</span> <div class="answer"> <ul> <li>Raid 0: Striping. Platten werden "aneinandergeh&auml;ngt".</li> <li>Raid 1: Mirroring. Daten werden auf mehrere Platten gespiegelt.</li> <li>Raid 2: Fehlerkorrigierender Hamming-code.</li> <li>Raid 3: Byteweise Parit&auml;t.</li> <li>Raid 4: Blockweise Parit&auml;t.</li> <li>Raid 5: Blockweise, verteilte Parit&auml;t.</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Warum verwenden wir Seitentabellen? K&ouml;nnte man nicht einfach im Hauptspeicher je zwei Datenw&ouml;rter kombinieren, wobei das erste die Metainformationen (z.B. Zugriffsrechte, Prozess-ID) und das zweite die Daten enth&auml;lt?</span> <div class="answer"> Prinzipiell wollen wir in einer x86-Architektur, dass sich die Hardware um das Paging k&uuml;mmert. Bei MIPS sieht das wohl anders aus (<a href="http://stackoverflow.com/q/10671147/562769">Quelle</a>). Wenn man sich f&uuml;r jedes Datenwort ein Datenwort mit Metainformationen merken w&uuml;rde, h&auml;tte man sehr viel Overhead. Diese Informationen hat man bei Paging auf IA-32 nur jede 4096 Byte! (Allgemein ist Overhead &uuml;brigens eine Begr&uuml;ndung, die h&auml;ufig stimmt.) Falls man es wirklich genau wissen will, sollte man wohl die <a href="http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html">IA-32 Architectures Software Developer&rsquo;s Manuals</a> lesen. Das sind ja nur 3044 Seiten. </div> <p></div></p> <div class="question"> <span class="question">Einstufige Seitentabellen sind deutlich einfacher zu verstehen und zu implementieren. Warum verwendet man sie nicht auf 64 Bit Systemen?</span> <div class="answer">Sie w&uuml;rden zu viel Speicher ben&ouml;tigen. Es wird eine Seitentabelle pro Prozess ben&ouml;tigt. Die Gr&ouml;&szlig;e einer einstufigen Seitentabelle berechnet sich wie folgt: Sei `$m$` die Gr&ouml;&szlig;e des Hauptspeichers in Byte, `$p$` die Gr&ouml;&szlig;e einer Seite in Byte und `$a$` die Anzahl der zus&auml;tzlichen Bit pro Seite (Access Control bits, validity. Siehe <a href="http://unix.stackexchange.com/q/68148/4784">StackExchange</a>). Dann gilt: Gr&ouml;&szlig;e der Seitentabelle = Gr&ouml;&szlig;e eines Seiteneintrages &middot; Anzahl der Seiten `$= \lceil \frac{\log_2(\frac{m}{p}) + a}{8}\rceil \text{Byte} \cdot \frac{2^{64} \text{ Byte}}{p \text{ Byte}}$` Typischerweise gilt: `$m = 4 GB = 4 \cdot 2^{30} \text{ Byte} = 2^{32} \text{ Byte}$`, `$p = 4096 \text{ Byte}$` und `$a = 8$`. Daraus folgt eine Seitengr&ouml;&szlig;e von 4 Byte und 4.503.599.627.370.496 Seiten. Das ergibt eine Seitentabellengr&ouml;&szlig;e von 16 Petabyte. </div> <p></div></p> <div class="question"> <span class="question">Wenn man nur Segmentierung nutzt, wie kommt man dann von der logischen Adresse auf die physische?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/segmentation-logical-to-linear-address-300x176.png"><img src="../images/2013/03/segmentation-logical-to-linear-address-300x176.png" alt="" width="300" height="176" class="size-medium wp-image-61751"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie ist ein Inode aufgebaut?</span> <div class="answer"> <div style="width: 256px" class="wp-caption aligncenter"><a href="../images/2013/03/inode-struktur-256x300.png"><img src="../images/2013/03/inode-struktur-256x300.png" alt="" width="256" height="300" class="size-medium wp-image-61871"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie gro&szlig; kann eine Datei maximal werden, wenn man Inodes mit jeweils einem indirekten, doppelt indirektem und dreifach indirektem Block hat?</span> <div class="answer"> Sei `$b$` die Gr&ouml;&szlig;e eines Blocks in Byte und ein Zeiger belege 4 Byte. Dann berechnet sich die maximale Dateigr&ouml;&szlig;e in Byte wie folgt: `$12 \cdot b + \frac{b}{4} \cdot b+ \frac{\frac{b}{4} \cdot b}{4} \cdot b + \frac{\frac{\frac{b}{4} \cdot b}{4} \cdot b}{4} \cdot b = 12 \cdot b + \frac{b^2}{4} + \frac{b^3}{16} + \frac{b^4}{64}$` Bei einer Blockgr&ouml;&szlig;e von 1024 Byte sind das 17,25 GB (<a href="http://www.wolframalpha.com/input/?i=12*1024%2B1024%5E2%2F4%2B1024%5E3%2F16%2B1024%5E4%2F64+byte">Rechnung</a>), bei einer Blockgr&ouml;&szlig;e von 4096 Byte sogar 4,40 TB (<a href="http://www.wolframalpha.com/input/?i=12*4096%2B4096%5E2%2F4%2B4096%5E3%2F16%2B4096%5E4%2F64+byte">Rechnung</a>)! Wenn ihr Linux habt, k&ouml;nnt ihr diese Werte so herausfinden: <div class="highlight"><pre><code class="bash">moose@pc08 ~ <span class="sb">`</span><span class="nv">$ </span>df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 303869280 16418288 272015268 6% / udev 1889040 4 1889036 1% /dev tmpfs 758712 988 757724 1% /run none 5120 0 5120 0% /run/lock none 1896772 772 1896000 1% /run/shm none 102400 8 102392 1% /run/user moose@pc08 ~ <span class="nv">$`</span> sudo tune2fs -l /dev/sda1 <span class="p">|</span> grep <span class="s1">&#39;Block size&#39;</span> Block size: 4096 </code></pre></div> </div> <p></div></p> <div class="question"> <span class="question">Depict the common memory layout of a process. Give an example of the data that is stored in each section.</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/process-memory-layout-300x165.jpg"><img src="../images/2013/03/process-memory-layout-300x165.jpg" alt="" width="300" height="165" class="size-medium wp-image-61931"/></a><p class="wp-caption-text"></p></div> Ich sehe gerade, dass bei rodata wohl das Schl&uuml;sselwort <code>const</code> mit dabei stehen sollte. Statische Variablen k&ouml;nnen nat&uuml;rlich ge&auml;ndert werden. </div> <p></div></p> <div class="question"> <span class="question">What is anonymous memory?</span> <div class="answer"> Anonymous memory is memory, that is not backed by a file. Examples are stack and heap. </div> <p></div></p> <h2>Material</h2> <p>Material zum &Uuml;ben (also <a href="http://os.ibds.kit.edu/1556.php">alte Klausuren</a>) gibts wie immer entweder online oder bei der Fachschaft.</p> <p>Die L&ouml;sungen zu den Klausuren sind Passwortgesch&uuml;tzt, aber wenn ihr euch einmal &uuml;ber VPN einloggt, stehen ganz unten auf der Seite die Zugangsdaten.</p> <p>Das Skript / die Folien sind im <a href="https://studium.kit.edu/sites/vab/0x8763DF03F4275B4F908D321A58479E61/vorlesungsunterlagen_pwg/Forms/AllItems.aspx?RootFolder=%2fsites%2fvab%2f0x8763DF03F4275B4F908D321A58479E61%2fvorlesungsunterlagen_pwg%2fVorlesung&FolderCTID=&View=%7b2672A6DD-CB1A-408E-888B-441716F3F757%7d">VAB</a>.</p> <p>Folgende Wiki-Artikel und manpages sollte man sich durchlesen: <ul> <li><a href="http://de.wikipedia.org/wiki/Unix-Dateirechte">Unix-Dateirechte</a> und <code>chmod</code> sowie <a href="../linux-access-rights-and-attributes/" title="Linux access rights and attributes">mein Artikel</a>.</li> </ul></p> <p>Als Buch kann ich neben dem Silberschatz folgendes Empfehlen: LPIC-1 - Vorbereitung auf die Pr&uuml;fung des Linux Professinal Institute. ISBN 978-3-937514-81-9</p> <h2>Some Random Facts</h2> <ul> <li><code>subl $16, %esp</code> allokiert 16 Byte auf dem Stack.</li> </ul> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: 18.03.2012 um 14:00 Uhr. <strong>Ort</strong>: ich bin im <a href="http://kit.carstengriesheimer.de/map/1459">30.21 Gerthsen</a> (<a href="https://studium.kit.edu/sites/vab/0xC1937D6957186A468FE059ECE05D74B8/Start/homepage.aspx">H&ouml;rsaalverteilung</a>) <strong>Dauer</strong>: 60 Minuten <strong>Punkte</strong>: 60 <strong>Benuspunkte</strong>: Abh&auml;ngig von den Punkten im &Uuml;bungsschein: <ul> <li>110 - 129 Punkte: 1 Bonuspunkt</li> <li>130 - 149 Punkte: 2 Bonuspunkte</li> <li>150 - 169 Punkte: 3 Bonuspunkte</li> <li>170 - x Punkte: 4 Bonuspunkte</li> </ul> <a href="https://studium.kit.edu/sites/vab/0xC1937D6957186A468FE059ECE05D74B8/Vorlesungsunterlagen/BS-WS1213-00aOrga.pdf">Quelle</a> <strong>Nicht vergessen</strong>: Studentenausweis <strong>Einsicht</strong>: 09.04.2013 (war seit sp&auml;testens 13.02.2013 bekannt) <strong>Ort der Einsicht</strong>: 07.07 (<a href="https://maps.google.com/maps?q=Vincenz-Prie%C3%9Fnitz-Stra%C3%9Fe+1,+Forschungsstelle+f%C3%BCr+Brandschutztechnik+am+KIT,+Oststadt+76131+Karlsruhe,+Baden-W%C3%BCrttemberg,+Deutschland&hl=de&ie=UTF8&ll=49.012738,8.423853&spn=0.015622,0.042272&geocode=FYXh6wIdLouAAA&hnear=Vincenz-Prie%C3%9Fnitz-Stra%C3%9Fe+1,+Oststadt+76131+Karlsruhe,+Baden-W%C3%BCrttemberg,+Deutschland&t=m&z=15">Vincenz-Priessnitz-Str. 1</a>, 2.OG, links), Raum 215 <strong>Zeit der Einsicht</strong>: Je nach Matrikelnummer unterschiedlich.</p> <h2>Ergebnisse</h2> <p><strike>H&auml;ngen noch nicht aus (Stand: 15.03.2013)</strike> H&auml;ngen nun aus (Stand: 08.04.2013) und <a href="https://studium.kit.edu/sites/vab/0xC1937D6957186A468FE059ECE05D74B8/vorlesungsunterlagen_pwg/Ergebnisse/klausur__18_03_2013.pdf">sind im VAB</a></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/03/os-klausur-ws201213-ergebnisse-300x227.png"><img src="../images/2013/03/os-klausur-ws201213-ergebnisse-300x227.png" alt="" width="300" height="227" class="size-medium wp-image-63331"/></a><p class="wp-caption-text"></p></div> How Chrome could be improved - 2nd Post http://martin-thoma.com/how-chrome-could-be-improved-2nd-post Fri, 22 Feb 2013 08:55:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-chrome-could-be-improved-2nd-post <p>Chrome 25 was just released and I would like to mention some features I am still missing. As I already wrote an article <a href="../how-chrome-could-be-improved/">How Chrome could be improved</a> for Chrome 18 I will also mention what was realised meanwhile. If you&#39;re curious if you have the current version, just visit <a href="chrome://chrome/">chrome://chrome/</a>.</p> <h2>Caps lock indicator for password fields</h2> <p>It&#39;s annoying to have caps lock on while typing passwords. So an indicator is needed.</p> <p>I would prefer a caps icon indicator solution: <div style="width: 160px" class="wp-caption alignnone"><a href="../images/2013/02/password-field-caps-icon-indicator.png"><img src="../images/2013/02/password-field-caps-icon-indicator.png" alt="" width="160" height="29" class="size-full wp-image-76613"/></a><p class="wp-caption-text"></p></div></p> <p>Another way to indicate it would be by text: <div style="width: 236px" class="wp-caption alignnone"><a href="../images/2013/02/password-field-caps-warning.png"><img src="../images/2013/02/password-field-caps-warning.png" alt="" width="236" height="67" class="size-full wp-image-76614"/></a><p class="wp-caption-text"></p></div></p> <h2>Improve MathML support</h2> <p>Chrome uses WebKit and WebKit didn&#39;t support MathML for quite a long time. A quite good work-around is <a href="http://www.mathjax.org/">MathJax</a>, but it is a work-around. Native support would be nice. With Chrome 24, they have added MathML support, but its still not optimal: <ul> <li>The font doesn&#39;t look very nice (see <a href="http://www.mozilla.org/projects/mathml/demo/texvsmml.html">MathML Torture Test</a> and image below)</li> <li>Multiscripts seems not to work</li> <li>big brackets get a whitespace in the middle (see image below)</li> <li>Scriptlevel seems not to work (see <a href="https://eyeasme.com/Joe/MathML/MathML_browser_test">MathML Browser test</a>)</li> </ul></p> <p>Here is an image where you can see some of the problems: <div style="width: 621px" class="wp-caption aligncenter"><a href="../images/2013/01/mathml-chrome24-rendering.png"><img src="../images/2013/01/mathml-chrome24-rendering.png" alt="" width="621" height="60" class="size-full wp-image-53981"/></a><p class="wp-caption-text"></p></div></p> <p>In Chrome 25, MathML was deactivated.</p> <ul> <li><a href="http://caniuse.com/mathml">Which Browsers support MathML?</a></li> <li><a href="http://www.w3.org/Math/XSL/csmall2.xml">Test page</a></li> <li><a href="http://html5test.com/">HTML5test.com</a> - Chrome seems to cheat, MathML is not supported as you can see on the test page. Chrome 25 scores 448/500 Points and 13 bonus points.</li> <li><a href="https://trac.webkit.org/wiki/MathML">Webkit MathML project</a>, <a href="https://bugs.webkit.org/show_bug.cgi?id=3251">Webkit MathML master bug</a></li> </ul> <h2>Stop Animations</h2> <p>Sometimes I would like to be able to stop animations. It can be very useful to be able to stop animations if you want to explain something in the animation. For example, <a href="http://de.wikipedia.org/wiki/Kurvenintegral#Kurvenintegral_erster_Art">this page on Wikipedia</a> has some animations. If you give private lessons in math to another person, you might want to tell something to the single images of the animation. But I am quite sure, that you can&#39;t speak that fast.</p> <p>It would also be nice if you were able to stop all animations on the page. Regrettably, some webmasters carry the usage of animations to excess.</p> <h2>What do I still miss?</h2> <h3>Disable sound for tabs</h3> <p>Sometimes I watch a movie while I play a flash game. Some flash games don&#39;t offer an option to mute them. So I would like to get the possibility to disable sound for one tab.</p> <p>It could look like this. <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/disable-tab-sound-300x172.png"><img src="../images/2012/04/disable-tab-sound-300x172.png" alt="" width="300" height="172" class="size-medium wp-image-20981"/></a><p class="wp-caption-text"></p></div></p> <p>UPDATE: This is <a href="https://code.google.com/p/chromium/issues/detail?id=3541">issue 3541</a>.</p> <h3>Spell checker</h3> <p>I write Blogs in German and in English. So I would like a spell-checker option at the bottom-left corner to switch languages: <div style="width: 698px" class="wp-caption aligncenter"><a href="../images/2012/04/spell-checker.png"><img src="../images/2012/04/spell-checker.png" alt="" width="698" height="91" class="size-full wp-image-21021"/></a><p class="wp-caption-text"></p></div></p> <h3>PDF page numbers</h3> <p>It would be great, if I could see the number of the page your currently on. Sometimes PDF-Documents don&#39;t even have numbers (e.g. LaTeX beamer slides). What do you do if you have a question to one slide if there are dozens of slides? Manually count them, to get the page number you&#39;re looking for?</p> <p><strong>UPDATE</strong>: You actually can jump to any page and share it as links! You only have to add <code>#page=123</code>. For example, you can take a look at this <a href="http://paws.wcu.edu/tsfoguel/tikzpgfmanual.pdf#page231">huge TikZ PDF manual</a>. </p> <p><strong>UPDATE2</strong>: You could automatically adjust this <code>#page=123</code> string according to the page that gets currently viewed. This would make sharing much easier and it would fix the issue that you don&#39;t know where you. Another advantage of this solution is that it doesn&#39;t bloat up the user interface.</p> <p><strong>UPDATE3</strong>: I finally found it! It&#39;s <a href="https://code.google.com/p/chromium/issues/detail?id=66900">issue 66900</a></p> <h3>Security</h3> <h4>Disabling Extensions</h4> <p>Auto-Disable extensions for https. Only PayPal, Amazon, Ebay, GMail and my bank accounts work with https. I don&#39;t need my Addons for these sites and I would appreciate if I could auto-disable them for https.</p> <h4>Password Reuse Visualizer</h4> <p>Firefox offers a tool which helps to identify passwords, that get reused often. It is called &#39;<a href='https://addons.mozilla.org/de/firefox/addon/password-reuse-visualizer/'>Password Reuse Visualizer</a>&#39; and looks like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/password-reuse.png"><img src="../images/2012/04/password-reuse.png" alt="" width="300" height="269" class="size-full wp-image-21101"/></a><p class="wp-caption-text"></p></div> <h2>What was realized?</h2> <h3>Rotate PDF</h3> <p>You can view <a href="http://cloud.github.com/downloads/MartinThoma/free-books/01-A-Study-in-Scarlet.pdf">this PDF</a> online as an example. If you make a right-click on it, you can rotate it now.</p> <div style="width: 412px" class="wp-caption aligncenter"><a href="../images/2012/08/pdf-chrome-rightclick-menu.png"><img src="../images/2012/08/pdf-chrome-rightclick-menu.png" alt="" width="412" height="338" class="size-full wp-image-42081"/></a><p class="wp-caption-text"></p></div> <h3>HTML5 input elements - partly</h3> <p>Chrome 25 does still not support the <a href="http://www.w3schools.com/html5/html5_form_input_types.asp">datetime input element</a>, tel input element, . They have added a very nice color input element: <input type="color" /> Some Screenshots for non-Chrome users: The button gets displayed like that: <div style="width: 55px" class="wp-caption aligncenter"><a href="../images/2012/08/chrome-color-chooser.png"><img src="../images/2012/08/chrome-color-chooser.png" alt="" width="55" height="33" class="size-full wp-image-42051"/></a><p class="wp-caption-text"></p></div> If you click on it, this dialog box gets displayed: <div style="width: 540px" class="wp-caption aligncenter"><a href="../images/2012/08/chrome-color-dialog.png"><img src="../images/2012/08/chrome-color-dialog.png" alt="" width="540" height="315" class="size-full wp-image-42061"/></a><p class="wp-caption-text"></p></div></p> <p>They have added support to many of the time-elements like week: <div style="width: 462px" class="wp-caption aligncenter"><a href="../images/2013/02/html5-week.png"><img src="../images/2013/02/html5-week.png" alt="" width="462" height="298" class="size-full wp-image-58061"/></a><p class="wp-caption-text"></p></div></p> <p>If you want to check how your browser displays the different input types, here is a <a href="http://www.martin-thoma.de/html5/input.php">test page for input elements</a>.</p> <p>According to </p> <h2>What was realized that I don't need?</h2> <p>The German wiki offers a really nice <a href="http://de.wikipedia.org/wiki/Google_Chrome#Versionsgeschichte">overview of version changes</a>: <ul> <li>Checking spelling mistakes with Google</li> <li>Chrome to mobile</li> <li>Metro-App for Windows 8</li> <li>Support for Retina-Displays</li> <li>Google Cloud Print</li> <li>Improved support for Gamepads</li> </ul></p> <h3>Web Speech API</h3> <p>Although I think that this feature is very cool, it doesn&#39;t quite work. Here is a <a href="https://www.google.com/intl/en/chrome/demos/speech.html">demo for Web Speech</a>.</p> <p>I said: &quot;Hallo Marie. Die Web Speech API funktioniert nocht nicht so richtig.&quot; (German) which means &quot;Hello Marie. The Web Speech API doesn&#39;t quite work by now.&quot; Web Speech recognized: &quot;Hallo Mausi Mausi. Zieh dich aus.&quot; (German) which means &quot;Hello darling. Undress!&quot;. I guess this would be interesting if I sent it per email without checking the recognized text.</p> How to check if two line segments intersect http://martin-thoma.com/how-to-check-if-two-line-segments-intersect Thu, 21 Feb 2013 11:19:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-check-if-two-line-segments-intersect <p>You have to line segments and you want to know if they intersect. I&#39;ll give you an algorithm how to do it.</p> <h2>Test cases</h2> <p>First of all, we should think about how lines can be arranged:</p> <p>[gallery columns=&quot;4&quot; ids=&quot;57661,57671,57681,57691,57701,57711,57581,57591,57601,57611,57621,57631,57641,57651&quot;]</p> <h2>Bounding boxes</h2> <p>You can draw boxes around line segments such that the edges of the boxes are in parallel to the coordinate axes:</p> <div style="width: 250px" class="wp-caption aligncenter"><a href="../images/2013/02/line-segments-bounding-box-250x300.png"><img src="../images/2013/02/line-segments-bounding-box-250x300.png" alt="" width="250" height="300" class="size-medium wp-image-57731"/></a><p class="wp-caption-text"></p></div> <p>With this image in mind, it is obvious that the bounding boxes need to intersect if the lines should intersect. At this point you have to make a decision: If the endpoint of one line is on the other line, is this an intersection? I think so. If two lines have at least one point in common, they intersect. If two bounding boxes have at least one point in common, they intersect.</p> <p>It is much easier to check if two bounding boxes intersect. It&#39;s simply:</p> <div class="highlight"><pre><code class="java"><span class="cm">/**</span> <span class="cm"> * Check if bounding boxes do intersect. If one bounding box</span> <span class="cm"> * touches the other, they do intersect.</span> <span class="cm"> * @param a first bounding box</span> <span class="cm"> * @param b second bounding box</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if they intersect,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">doBoundingBoxesIntersect</span><span class="o">(</span><span class="n">Point</span><span class="o">[]</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">x</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">x</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">y</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">y</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">y</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">y</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <p>If you have difficulties to understand why this works, take a look at this great <a href="http://silentmatt.com/rectangle-intersection/">animation for this formula</a>.</p> <h2>The algorithm</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/02/flowchart.png"><img src="../images/2013/02/flowchart.png" alt="" width="500" height="228" class="size-full wp-image-57771"/></a><p class="wp-caption-text"></p></div> <p>Looks quite simple, doesn&#39;t it?</p> <h3>Cross product</h3> <p>Well, you might notice that you need to check if one line intersects with a given line segment. To check this, you have to understand one cool idea:</p> <p>You can definie a cross product for points: <code>$\begin{align} \times_P&amp;: Point \times Point \rightarrow \mathbb{R}\\ \times_P(a, b) &amp;:= a.x \cdot b.y - b.x \cdot a.y; \end{align}$</code></p> <p>This cross product has one nice characteristics: <code>$a \times_P b = 0 \Leftrightarrow a$</code> and <code>$b$</code> are on one line through origin</li></p> <p>You can verify this. If you take two points on a line through origin, they have the same slope <code>$\frac{\Delta y}{\Delta x}$</code>: <code>$ \begin{align} 0 &amp;= a \times_P b\\ \Leftrightarrow 0 &amp;= a.x \cdot b.y - b.x \cdot a.y\\ \Leftrightarrow b.x \cdot a.y &amp;= a.x \cdot b.y\\ \Leftrightarrow \frac{a.y}{a.x} &amp;= \frac{b.y}{b.x} \end{align} $</code></p> <p>Ok, now you can check if a point is on a line:</p> <div class="highlight"><pre><code class="java"> <span class="cm">/**</span> <span class="cm"> * Checks if a Point is on a line</span> <span class="cm"> * @param a line (interpreted as line, although given as line</span> <span class="cm"> * segment)</span> <span class="cm"> * @param b point</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if point is on line, otherwise</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt;</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isPointOnLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Move the image, so that a.first is on (0|0)</span> <span class="n">LineSegment</span> <span class="n">aTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineSegment</span><span class="o">(</span><span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">));</span> <span class="n">Point</span> <span class="n">bTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">);</span> <span class="kt">double</span> <span class="n">r</span> <span class="o">=</span> <span class="n">crossProduct</span><span class="o">(</span><span class="n">aTmp</span><span class="o">.</span><span class="na">second</span><span class="o">,</span> <span class="n">bTmp</span><span class="o">);</span> <span class="k">return</span> <span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">r</span><span class="o">)</span> <span class="o">&lt;</span> <span class="n">EPSILON</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <p>The second cool characteristic of the cross product is that it can be used to determine if a point b is left or right of the line through the origin and a point a:</p> <div class="highlight"><pre><code class="java"> <span class="cm">/**</span> <span class="cm"> * Checks if a point is right of a line. If the point is on the</span> <span class="cm"> * line, it is not right of the line.</span> <span class="cm"> * @param a line segment interpreted as a line</span> <span class="cm"> * @param b the point</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if the point is right of the line,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isPointRightOfLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Move the image, so that a.first is on (0|0)</span> <span class="n">LineSegment</span> <span class="n">aTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineSegment</span><span class="o">(</span><span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">));</span> <span class="n">Point</span> <span class="n">bTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">);</span> <span class="k">return</span> <span class="nf">crossProduct</span><span class="o">(</span><span class="n">aTmp</span><span class="o">.</span><span class="na">second</span><span class="o">,</span> <span class="n">bTmp</span><span class="o">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <p>When we have one line <code>$a$</code> through the origin and one line segment <code>$b$</code>, you can check if <code>$b$</code> crosses <code>$a$</code> by checking if the end points of <code>$b$</code> are on different sides of <code>$a$</code>:</p> <div class="highlight"><pre><code class="java"> <span class="cm">/**</span> <span class="cm"> * Check if line segment first touches or crosses the line that is </span> <span class="cm"> * defined by line segment second.</span> <span class="cm"> *</span> <span class="cm"> * @param first line segment interpreted as line</span> <span class="cm"> * @param second line segment</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if line segment first touches or</span> <span class="cm"> * crosses line second,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">LineSegment</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">isPointOnLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">first</span><span class="o">)</span> <span class="o">||</span> <span class="n">isPointOnLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">second</span><span class="o">)</span> <span class="o">||</span> <span class="o">(</span><span class="n">isPointRightOfLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">first</span><span class="o">)</span> <span class="o">^</span> <span class="n">isPointRightOfLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">second</span><span class="o">));</span> <span class="o">}</span> </code></pre></div> <p>Now you have everything you need:</p> <div class="highlight"><pre><code class="java"> <span class="cm">/**</span> <span class="cm"> * Check if line segments intersect</span> <span class="cm"> * @param a first line segment</span> <span class="cm"> * @param b second line segment</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if lines do intersect,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">doLinesIntersect</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">LineSegment</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">box1</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="na">getBoundingBox</span><span class="o">();</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">box2</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="na">getBoundingBox</span><span class="o">();</span> <span class="k">return</span> <span class="nf">doBoundingBoxesIntersect</span><span class="o">(</span><span class="n">box1</span><span class="o">,</span> <span class="n">box2</span><span class="o">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">a</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <p>By the way, testcase F5 is the only reason why you need <code>doBoundingBoxesIntersect(box1, box2)</code>. All other tests still pass if you remove this function.</p> <h2>Where do two line segments intersect?</h2> <p>When you know that two line segments intersect, you can also calculate the intersection. The intersection could be a line or only a point. </p> <p>I did this with JavaScript: <iframe src="../html5/line-segment-intersection/" width="800" height="600"> <p>Ihr Browser kann leider keine eingebetteten Frames anzeigen. Die Seite ist <a href="../html5/line-segment-intersection/">hier</a>.</p> </iframe></p> <p>This is the code that checks for line segments:</p> <div class="highlight"><pre><code class="javascript"><span class="cm">/** You know that lines a and b have an intersection and now you</span> <span class="cm"> want to get it!</span> <span class="cm">*/</span> <span class="kd">function</span> <span class="nx">getIntersection</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* the intersection [(x1,y1), (x2, y2)]</span> <span class="cm"> it might be a line or a single point. If it is a line,</span> <span class="cm"> then x1 = x2 and y1 = y2. */</span> <span class="kd">var</span> <span class="nx">x1</span><span class="p">,</span> <span class="nx">y1</span><span class="p">,</span> <span class="nx">x2</span><span class="p">,</span> <span class="nx">y2</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="c1">// Case (A)</span> <span class="c1">// As a is a perfect vertical line, it cannot be represented</span> <span class="c1">// nicely in a mathematical way. But we directly know that</span> <span class="c1">//</span> <span class="nx">x1</span> <span class="o">=</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">x2</span> <span class="o">=</span> <span class="nx">x1</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="c1">// Case (AA): all x are the same!</span> <span class="c1">// Normalize</span> <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;first&quot;</span><span class="o">:</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">],</span> <span class="s2">&quot;second&quot;</span><span class="o">:</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">]};</span> <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="nx">b</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;first&quot;</span><span class="o">:</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">],</span> <span class="s2">&quot;second&quot;</span><span class="o">:</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">]};</span> <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nx">a</span><span class="p">;</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">b</span><span class="p">;</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Now we know that the y-value of a[&quot;first&quot;] is the </span> <span class="c1">// lowest of all 4 y values</span> <span class="c1">// this means, we are either in case (AAA):</span> <span class="c1">// a: x--------------x</span> <span class="c1">// b: x---------------x</span> <span class="c1">// or in case (AAB)</span> <span class="c1">// a: x--------------x</span> <span class="c1">// b: x-------x</span> <span class="c1">// in both cases:</span> <span class="c1">// get the relavant y intervall</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">];</span> <span class="nx">y2</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">],</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// Case (AB)</span> <span class="c1">// we can mathematically represent line b as</span> <span class="c1">// y = m*x + t &lt;=&gt; t = y - m*x</span> <span class="c1">// m = (y1-y2)/(x1-x2)</span> <span class="kd">var</span> <span class="nx">m</span><span class="p">,</span> <span class="nx">t</span><span class="p">;</span> <span class="nx">m</span> <span class="o">=</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span><span class="o">/</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]);</span> <span class="nx">t</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">m</span><span class="o">*</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">m</span><span class="o">*</span><span class="nx">x1</span> <span class="o">+</span> <span class="nx">t</span><span class="p">;</span> <span class="nx">y2</span> <span class="o">=</span> <span class="nx">y1</span> <span class="p">}</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="c1">// Case (B)</span> <span class="c1">// essentially the same as Case (AB), but with</span> <span class="c1">// a and b switched</span> <span class="nx">x1</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">x2</span> <span class="o">=</span> <span class="nx">x1</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nx">a</span><span class="p">;</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">b</span><span class="p">;</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">tmp</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">m</span><span class="p">,</span> <span class="nx">t</span><span class="p">;</span> <span class="nx">m</span> <span class="o">=</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span><span class="o">/</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]);</span> <span class="nx">t</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">m</span><span class="o">*</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">m</span><span class="o">*</span><span class="nx">x1</span> <span class="o">+</span> <span class="nx">t</span><span class="p">;</span> <span class="nx">y2</span> <span class="o">=</span> <span class="nx">y1</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// Case (C)</span> <span class="c1">// Both lines can be represented mathematically</span> <span class="kd">var</span> <span class="nx">ma</span><span class="p">,</span> <span class="nx">mb</span><span class="p">,</span> <span class="nx">ta</span><span class="p">,</span> <span class="nx">tb</span><span class="p">;</span> <span class="nx">ma</span> <span class="o">=</span> <span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span><span class="o">/</span> <span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]);</span> <span class="nx">mb</span> <span class="o">=</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">])</span><span class="o">/</span> <span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]);</span> <span class="nx">ta</span> <span class="o">=</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">ma</span><span class="o">*</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">tb</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;y&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="nx">mb</span><span class="o">*</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="k">if</span> <span class="p">(</span><span class="nx">ma</span> <span class="o">==</span> <span class="nx">mb</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Case (CA)</span> <span class="c1">// both lines are in parallel. As we know that they </span> <span class="c1">// intersect, the intersection could be a line</span> <span class="c1">// when we rotated this, it would be the same situation </span> <span class="c1">// as in case (AA)</span> <span class="c1">// Normalize</span> <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;first&quot;</span><span class="o">:</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">],</span> <span class="s2">&quot;second&quot;</span><span class="o">:</span> <span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">]};</span> <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="nx">b</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;first&quot;</span><span class="o">:</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">],</span> <span class="s2">&quot;second&quot;</span><span class="o">:</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">]};</span> <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">])</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">tmp</span> <span class="o">=</span> <span class="nx">a</span><span class="p">;</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">b</span><span class="p">;</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">tmp</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// get the relavant x intervall</span> <span class="nx">x1</span> <span class="o">=</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">];</span> <span class="nx">x2</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">],</span> <span class="nx">b</span><span class="p">[</span><span class="s2">&quot;second&quot;</span><span class="p">][</span><span class="s2">&quot;x&quot;</span><span class="p">]);</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">ma</span><span class="o">*</span><span class="nx">x1</span><span class="o">+</span><span class="nx">ta</span><span class="p">;</span> <span class="nx">y2</span> <span class="o">=</span> <span class="nx">ma</span><span class="o">*</span><span class="nx">x2</span><span class="o">+</span><span class="nx">ta</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// Case (CB): only a point as intersection:</span> <span class="c1">// y = ma*x+ta</span> <span class="c1">// y = mb*x+tb</span> <span class="c1">// ma*x + ta = mb*x + tb</span> <span class="c1">// (ma-mb)*x = tb - ta</span> <span class="c1">// x = (tb - ta)/(ma-mb)</span> <span class="nx">x1</span> <span class="o">=</span> <span class="p">(</span><span class="nx">tb</span><span class="o">-</span><span class="nx">ta</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="nx">ma</span><span class="o">-</span><span class="nx">mb</span><span class="p">);</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">ma</span><span class="o">*</span><span class="nx">x1</span><span class="o">+</span><span class="nx">ta</span><span class="p">;</span> <span class="nx">x2</span> <span class="o">=</span> <span class="nx">x1</span><span class="p">;</span> <span class="nx">y2</span> <span class="o">=</span> <span class="nx">y1</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;first&quot;</span><span class="o">:</span> <span class="p">{</span><span class="s2">&quot;x&quot;</span><span class="o">:</span><span class="nx">x1</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="o">:</span><span class="nx">y1</span><span class="p">},</span> <span class="s2">&quot;second&quot;</span><span class="o">:</span> <span class="p">{</span><span class="s2">&quot;x&quot;</span><span class="o">:</span><span class="nx">x2</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="o">:</span><span class="nx">y2</span><span class="p">}};</span> <span class="p">}</span> </code></pre></div> <h2>TL;DR</h2> <p>The complete, tested code is on <a href="https://github.com/MartinThoma/algorithms/tree/master/crossingLineCheck/Geometry/src">GitHub</a>. Here is the most important part:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Geometry</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">double</span> <span class="n">EPSILON</span> <span class="o">=</span> <span class="mf">0.000001</span><span class="o">;</span> <span class="cm">/**</span> <span class="cm"> * Calculate the cross product of two points.</span> <span class="cm"> * @param a first point</span> <span class="cm"> * @param b second point</span> <span class="cm"> * @return the value of the cross product</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">double</span> <span class="nf">crossProduct</span><span class="o">(</span><span class="n">Point</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">x</span> <span class="o">*</span> <span class="n">b</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">b</span><span class="o">.</span><span class="na">x</span> <span class="o">*</span> <span class="n">a</span><span class="o">.</span><span class="na">y</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Check if bounding boxes do intersect. If one bounding box</span> <span class="cm"> * touches the other, they do intersect.</span> <span class="cm"> * @param a first bounding box</span> <span class="cm"> * @param b second bounding box</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if they intersect,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">doBoundingBoxesIntersect</span><span class="o">(</span><span class="n">Point</span><span class="o">[]</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">x</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">x</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">y</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">y</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">y</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">y</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Checks if a Point is on a line</span> <span class="cm"> * @param a line (interpreted as line, although given as line</span> <span class="cm"> * segment)</span> <span class="cm"> * @param b point</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if point is on line, otherwise</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt;</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">isPointOnLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Move the image, so that a.first is on (0|0)</span> <span class="n">LineSegment</span> <span class="n">aTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineSegment</span><span class="o">(</span><span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">));</span> <span class="n">Point</span> <span class="n">bTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">);</span> <span class="kt">double</span> <span class="n">r</span> <span class="o">=</span> <span class="n">crossProduct</span><span class="o">(</span><span class="n">aTmp</span><span class="o">.</span><span class="na">second</span><span class="o">,</span> <span class="n">bTmp</span><span class="o">);</span> <span class="k">return</span> <span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">r</span><span class="o">)</span> <span class="o">&lt;</span> <span class="n">EPSILON</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Checks if a point is right of a line. If the point is on the</span> <span class="cm"> * line, it is not right of the line.</span> <span class="cm"> * @param a line segment interpreted as a line</span> <span class="cm"> * @param b the point</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if the point is right of the line,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">isPointRightOfLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">Point</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Move the image, so that a.first is on (0|0)</span> <span class="n">LineSegment</span> <span class="n">aTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LineSegment</span><span class="o">(</span><span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">),</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">a</span><span class="o">.</span><span class="na">second</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">));</span> <span class="n">Point</span> <span class="n">bTmp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Point</span><span class="o">(</span><span class="n">b</span><span class="o">.</span><span class="na">x</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">y</span> <span class="o">-</span> <span class="n">a</span><span class="o">.</span><span class="na">first</span><span class="o">.</span><span class="na">y</span><span class="o">);</span> <span class="k">return</span> <span class="nf">crossProduct</span><span class="o">(</span><span class="n">aTmp</span><span class="o">.</span><span class="na">second</span><span class="o">,</span> <span class="n">bTmp</span><span class="o">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Check if line segment first touches or crosses the line that is</span> <span class="cm"> * defined by line segment second.</span> <span class="cm"> *</span> <span class="cm"> * @param first line segment interpreted as line</span> <span class="cm"> * @param second line segment</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if line segment first touches or</span> <span class="cm"> * crosses line second,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">LineSegment</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">isPointOnLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">first</span><span class="o">)</span> <span class="o">||</span> <span class="n">isPointOnLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">second</span><span class="o">)</span> <span class="o">||</span> <span class="o">(</span><span class="n">isPointRightOfLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">first</span><span class="o">)</span> <span class="o">^</span> <span class="n">isPointRightOfLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">.</span><span class="na">second</span><span class="o">));</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Check if line segments intersect</span> <span class="cm"> * @param a first line segment</span> <span class="cm"> * @param b second line segment</span> <span class="cm"> * @return &lt;code&gt;true&lt;/code&gt; if lines do intersect,</span> <span class="cm"> * &lt;code&gt;false&lt;/code&gt; otherwise</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">boolean</span> <span class="nf">doLinesIntersect</span><span class="o">(</span><span class="n">LineSegment</span> <span class="n">a</span><span class="o">,</span> <span class="n">LineSegment</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">box1</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="na">getBoundingBox</span><span class="o">();</span> <span class="n">Point</span><span class="o">[]</span> <span class="n">box2</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="na">getBoundingBox</span><span class="o">();</span> <span class="k">return</span> <span class="nf">doBoundingBoxesIntersect</span><span class="o">(</span><span class="n">box1</span><span class="o">,</span> <span class="n">box2</span><span class="o">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">lineSegmentTouchesOrCrossesLine</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">a</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Addendum</h2> <p>Some notes for me: <ul> <li>Writing Tests first is worth the effort. I guess it finally saved me some time and it gives me some confidence that my code works.</li> <li>I should update my system. I&#39;m still using Ubuntu 10.04.4 LTS. Especially, I have Eclipse 3.5.2. This means I could not try <a href="http://www.eclemma.org/">EclEmma</a> to test my code coverage :-(</li> <li>LaTeX is great. I&#39;ve created all images with LaTeX and it was quite fast after I got the first one. Here is the <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/tikz/line-segments">LaTeX source</a>.</li> </ul></p> <p>edit: I now have a more modern system. So I was able to use EclEmma, which works fine. And I have 100% branch code coverage for this part of code :-)</p> How to create a digital signature http://martin-thoma.com/how-to-create-a-digital-signature Sat, 16 Feb 2013 10:34:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-create-a-digital-signature <p>At first, you have to write your signature on a white sheet of paper. You might have to make several tries:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/02/signature-tries.jpg"><img src="../images/2013/02/signature-tries.jpg" alt="" width="512" height="230" class="size-full wp-image-57241"/></a><p class="wp-caption-text"></p></div> <p>Then you should scan it in a high quality. Now crop the image to the size you like. I have used <a href="http://www.gimp.org/">GIMP</a> for this task:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/crop-to-selection-300x216.png"><img src="../images/2013/02/crop-to-selection-300x216.png" alt="" width="300" height="216" class="size-medium wp-image-57251"/></a><p class="wp-caption-text"></p></div> <p>Now you should have an image like this one: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/max-mustermann-cropped-signature-300x60.jpg"><img src="../images/2013/02/max-mustermann-cropped-signature-300x60.jpg" alt="" width="300" height="60" class="size-medium wp-image-57261"/></a><p class="wp-caption-text"></p></div></p> <h2>Inkscape</h2> <p>Open it with <a href="http://inkscape.org/download">Inkscape</a>, click on the image go to the menu &quot;Path &gt; Trace Bitmap&quot;:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/inkscape-trace-bitmap-300x244.png"><img src="../images/2013/02/inkscape-trace-bitmap-300x244.png" alt="" width="300" height="244" class="size-medium wp-image-57271"/></a><p class="wp-caption-text"></p></div> <p>Now choose &quot;Colors&quot;, check &quot;Remove background&quot; and click on &quot;Update&quot;: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/trace-bitmap-settings-300x216.png"><img src="../images/2013/02/trace-bitmap-settings-300x216.png" alt="" width="300" height="216" class="size-medium wp-image-57291"/></a><p class="wp-caption-text"></p></div></p> <p>Close the window and look closely at the image. It should now look like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/traced-bitmap-in-inkscape-300x73.png"><img src="../images/2013/02/traced-bitmap-in-inkscape-300x73.png" alt="" width="300" height="73" class="size-medium wp-image-57301"/></a><p class="wp-caption-text"></p></div></p> <p>You have to click at a part of the image that is currently not selected and then hit the remove key. </p> <p>Now select the &quot;Edit path by nodes&quot; tool: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/edit-path-by-nodes-300x167.png"><img src="../images/2013/02/edit-path-by-nodes-300x167.png" alt="" width="300" height="167" class="size-medium wp-image-57311"/></a><p class="wp-caption-text"></p></div></p> <p>Click on the gray area. The image will look like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/remove-nodes-in-inkscape-300x204.png"><img src="../images/2013/02/remove-nodes-in-inkscape-300x204.png" alt="" width="300" height="204" class="size-medium wp-image-57321"/></a><p class="wp-caption-text"></p></div></p> <p>Remove nodes of areas that have to many or where you don&#39;t want to have this gray area. This will take some time. <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/inkscape-remove-nodes-300x247.png"><img src="../images/2013/02/inkscape-remove-nodes-300x247.png" alt="" width="300" height="247" class="size-medium wp-image-57331"/></a><p class="wp-caption-text"></p></div></p> <p>As soon as you&#39;re finished, you should save your signature as SVG (if you want to edit it later) and as PDF (for LaTeX).</p> <h2>LaTeX</h2> <div class="highlight"><pre><code class="text">\documentclass[a4paper,12pt]{article} \usepackage{pdfpages} % needed for includepdf \begin{document} \section*{Some Text} Lorem ipsum dolor sit amet, pro discere accusam detraxit ei. Ei maluisset definitiones ius. Ut quo persius reprimique, sed ea postulant consulatu, essent tibique et cum. Usu ne etiam facilis, eam everti eruditi ea, his ad eros sententiae. Cu amet admodum recteque mei. Postea aeterno officiis pri in, per te quis numquam, ius ei veri consul. Ei sententiae constituam vix, ad quidam noster bonorum mel. Eu ius rebum disputationi, invenire signiferumque mei ea. Euripidis expetendis argumentum sit eu, viris latine persecuti mel at. Mel ut clita fabellas laboramus, an discere inermis est. Nulla liberavisse usu in. Augue comprehensam ut pro, ne vel dicit oblique. Vel dico omnium et, vis an tota solum argumentum. Eam omnes quidam in. Eu eam illum malorum diceret, nonumes mentitum repudiare eam et.\\ \noindent Yours faithfully\\ \\ \includegraphics[height=10mm]{max-mustermann-cropped-signature.pdf}\\ Max Mustermann \end{document} </code></pre></div> <h2>Result</h2> <p>The result looks like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/latex-signed-300x141.png"><img src="../images/2013/02/latex-signed-300x141.png" alt="" width="300" height="141" class="size-medium wp-image-57351"/></a><p class="wp-caption-text"></p></div> <p>It looks even better if you make the image a little bit darker in the first step with GIMP.</p> CMOS circuits http://martin-thoma.com/cmos-circuits Fri, 08 Feb 2013 22:39:26 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/cmos-circuits <p>CMOS is a technology used to create digital circuits. The basic idea is to combine a pMOS circuit and a nMOS circuit.</p> <h2>MOSFET</h2> <p>Four <abbr title="metal&ndash;oxide&ndash;semiconductor field-effect transistor">MOSFET</abbr> are important for CMOS:</p> <table> <tr> <th>&nbsp;</th> <th>nMOS</th> <th>pMOS</th> </tr> <tr> <th>depletion</th> <td><a href="../images/2013/02/nmos-selbstsleitend.jpg"><img src="../images/2013/02/nmos-selbstsleitend.jpg" alt="nMOS - depletion type" width="222" height="174" class="size-full wp-image-56741" /></a></td> <td><a href="../images/2013/02/pmos-selbstsleitend.jpg"><img src="../images/2013/02/pmos-selbstsleitend.jpg" alt="pMOS depletion" width="215" height="181" class="size-full wp-image-56761" /></a></td> </tr> <tr> <th>enhancement</th> <td><a href="../images/2013/02/nmos-selbstsperrend.jpg"><img src="../images/2013/02/nmos-selbstsperrend.jpg" alt="nMOS - enhancement type" width="221" height="171" class="size-full wp-image-56751" /></td> <td><a href="../images/2013/02/pmos-selbstsperrend.jpg"><img src="../images/2013/02/pmos-selbstsperrend.jpg" alt="pMOS - enhancement type" width="181" height="163" class="size-full wp-image-56771" /></a></td> </tr> </table> <h2>Inverter</h2> <div style="width: 434px" class="wp-caption aligncenter"><a href="../images/2013/02/cmos-inverter.jpg"><img src="../images/2013/02/cmos-inverter.jpg" alt="" width="434" height="512" class="size-full wp-image-56721"/></a><p class="wp-caption-text"></p></div> <h2>NAND</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2013/02/cmos-nand.jpg"><img src="../images/2013/02/cmos-nand.jpg" alt="" width="512" height="488" class="size-full wp-image-56731"/></a><p class="wp-caption-text"></p></div> <h2>Images</h2> <p>I tried to find good software to create those images. I didn&#39;t find any that allowed me to create those images. I&#39;ve tried this:</p> <ul> <li><a href="http://wwwu.uni-klu.ac.at/magostin/cirkuit.html">Cirkuit</a>: Looks good, but crashes.</li> <li>EAGLE: too complex</li> <li>KLogic: seems only to be able to create logic plans</li> <li>PCB Designer: too complex, weird interface</li> </ul> <h2>Anything else?</h2> <p>Which other circuits do we have to know? (Perhaps Transmission Gate?)</p> Algorithmen II - Klausur http://martin-thoma.com/algorithmen-ii-klausur Mon, 04 Feb 2013 19:03:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/algorithmen-ii-klausur <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesungen des Moduls &bdquo;Algorithmen II&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Prof. Dr. Wagner geh&ouml;rt.</div> <h2>Vorbereitung</h2> <p><strong>Themen</strong>: <ul> <li>Netzwerke und Fl&uuml;sse <ul> <li>Wert eines Flusses, s-t-Schnitt</li> <li>(Minimale) Schnitte, erh&ouml;hende Wege</li> <li>Max-Flow Min-Cut Theorem</li> <li>Ford-Fulkerson-Algorithmus: <ul> <li>Erh&ouml;hende Wege, Vorw&auml;rts- und R&uuml;ckw&auml;rtskanten</li> <li>Spezialfall: Algorithmus von Edmonds und Karp <ul> <li>K&uuml;rzeste erh&ouml;hende Wege</li> <li>Laufzeit: <code>$\mathcal{O}(|V| \cdot |E^2|)$</code></li> </ul> </li> </ul> <li>Flussproblem als Lineares Programm</li> <li>Dualit&auml;t</li> <li>Algorithmus von Goldberg und Tarjan (Residualgraph, Push/Relabel)</li> <li>MINCOSTFLOW, erh&ouml;hende Kreise</li> <li>Cycle Canceling Algorithmus</li> <li>Algorithmus von Stoer &amp; Wagner</li> </ul> </li> <li>Kreise <ul> <li>Definition: Kreis, einfacher Kreis</li> <li>Kreisbasen, Kreisraum</li> <li>Matroide</li> <li>Zertifikat fur MCB</li> </ul> </li> <li>Randomisierte Algorithmen <ul> <li>Las Vegas Algorithmus / Monte Carlo Algorithmus</li> <li>Monte Carlo Algorithmus f&uuml;r MinCut</li> <li>Fast Random MinCut</li> <li>Maximum Satisfiability Problem</li> <li>Random MaxCut</li> <li>Maximum Satisfiability Problem</li> <li><abbr title="Integer Quadratic Program">IQP</abbr></li> </ul> </li> <li>Algorithmische Geometrie <ul> <li>Was ist ein einfaches Polygon, was ein konvexes Polygon?</li> <li>Sweep Line Algorithmus</li> <li>Konvexe H&uuml;lle: <ul> <li>Graham Scan</li> <li>Gift Wrapping Algorithmus (Jarvis March) &rarr; <a href="http://codegolf.stackexchange.com/q/11035/5240">Code Golf</a></li> </ul> </ul> </li> <li>String-Matching <ul> <li>Rabin &amp; Karp</li> <li>Endlichen Automaten</li> <li>Vorberechnungen f&uuml;r viele Suchanfragen: <ul> <li>Suffixb&auml;ume</li> <li>Suffixarray</li> <li><abbr title="longest common prefix">LCP</abbr>-Array</li> </ul> </li> </ul> </li> <li>Approximierende Algorithmen <ul> <li>Multiprozessor-Scheduling <ul> <li>List Scheduling Algorithm</li> </ul> </li> <li>Bin Packing <ul> <li><span class="smallCaps">Next Fit</span> Algorithm</li> <li><span class="smallCaps">First Fit</span> Algorithm</li> <li><abbr title="Asymptotic PAS">APAS</abbr></li> <li>Restricted Bin Packing</li> <li>APAS und FAPAS</li> </ul> </li> <li><abbr title="Polynomielles Approximationsschema">PAS</abbr></li> <li><abbr title="Fully Polynomial Approximation Scheme">FPAS</abbr></li> </ul> </li> <li>Parametrisierte Algorithmen &rarr; <a href="http://de.wikipedia.org/wiki/Parametrisierter_Algorithmus">Wiki</a> <ul> <li>Fixed Parameter Tractable</li> <li>Kernbildung (Vertex Cover)</li> <li>Tiefenbeschrankte Suchb&auml;ume</li> </ul> </li> <li>Online Algorithmen <ul> <li>Job Scheudling</li> <li>c-kompetitivit&auml;t</li> <li>Ski-Verleih Beispiel</li> <li>Paging (<abbr title="Longest Forward Distance">LFD</abbr>, Kompetitive Paging-Algorithmen, <span class="hint" title="FIFO, LRU">Konservative Paging-Algorithmen</span>, <a href="http://de.wikipedia.org/wiki/FIFO-Anomalie">B&eacute;l&aacute;dys Anomalie</a>)</li> </ul> </li> <li>Parallele Algorithmen <ul> <li><abbr title="Parallel Random Access Machine">PRAM</abbr> Modell</li> <li>Berechnung von Summen</li> <li>Pr&auml;fxsumme</li> <li>List Ranking</li> <li>Binaroperationen einer partitionierten Menge</li> <li>Zusammenhangskomponenten</li> <li>Minimaler Spannbaum</li> </ul> </li> <li>Algorithmen fur externen Speicher <ul> <li>Einfaches Rechnermodell</li> <li>Interner Stack / Externer Stack / Externe Warteschlange</li> <li>Multiway Merge Sort</li> <li>Tournament-B&auml;ume</li> </ul> </li> </ul></p> <h2>Algorithmen und Laufzeiten</h2> <table> <thead> <tr> <th>Algorithmus</th><th>Laufzeit</th> </tr> </thead> <tbody> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung2.pdf#page=18">Algorithmus von Ford und Fulkerson </a></td><td>-</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung2.pdf#page=21">Algorithmus von Edmonds und Karp </a></td><td>`$\mathcal{O}(|V| \cdot |E|^2)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung3.pdf#page=23">Algorithmus von Stoer und Wagner</a></td><td>`$\mathcal{O}(|V|^3)$` oder besser, je nach Wahl des aktiven Knotens</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung5.pdf#page=7">Algorithmus von Stoer und Wagner</a></td><td>`$\mathcal{O}(|V|^2 \log |V| + |V| |E|)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung7.pdf#page=12">Algorithmus von Horton</a></td><td>`$\mathcal{O}(|E|^3 |V|)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung7.pdf#page=14">Algorithmus von de Pina</a></td><td>`$\mathcal{O}(|E|^3 + |E| |V|^2 \log |V|)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung10.pdf#page=27">Sweep-Line-Algorithmus</a></td><td>`$\mathcal{O}(n \cdot \log n)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung11.pdf#page=22">Graham-Scan</a></td><td>`$\mathcal{O}(n \cdot \log n)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung11.pdf#page=22">Gift-Wrapping (Jarvis' March)</a></td><td>`$\mathcal{O}(h \cdot n)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung12.pdf#page=23">Algorithmus von Rabin und Karp</a></td><td>`$\mathcal{O}((n-m) \cdot m)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung12.pdf#page=28">String-Matching-Automat</a></td><td>Vorbereitung: `$\mathcal{O}(|\Sigma| \cdot m^3)$`<br/>Matching: `$\mathcal{O}(n)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung13.pdf#page=5">Suffix-B&auml;ume</a></td><td>Vorbereitung: `$\mathcal{O}(n^2)$`<br/>Matching: `$\mathcal{O}(m \cdot \log |\Sigma|)$`</td></tr> <tr><td><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung13.pdf#page=26">Suffix-Arrays</a></td><td>Vorbereitung: `$\mathcal{O}(n)$`<br/>Matching: `$\mathcal{O}(m \cdot \log |n|)$`</td></tr> </tbody> </table> <h2>Komplexit&auml;tsklassen</h2> <div class="definition">Die Klasse `$\mathcal{PP}$` (probabilistic polynomial) enth&auml;lt alle Entscheidungsprobleme `$\Pi$`, f&uuml;r die es einen polynomialen, randomisierten Algorithmus `$A$` gibt, so dass f&uuml;r alle Instanzen `$I$` von `$\Pi$` gilt: `$ \begin{cases} I \in Y_\Pi & Pr[A(I) \text{ ist "Ja"}] \ge \frac{1}{2} \\ I \notin Y_\Pi & Pr[A(I) \text{ ist "Ja"}] \le \frac{1}{2} \end{cases}$` </div> <div class="definition">Die Klasse `$\mathcal{BPP}$` (bounded error PP) enth&auml;lt alle Entscheidungsprobleme `$\Pi$`, f&uuml;r die es einen polynomialen, randomisierten Algorithmus `$A$` gibt, so dass f&uuml;r alle Instanzen `$I$` von `$\Pi$` gilt: `$ \begin{cases} I \in Y_\Pi & Pr[A(I) \text{ ist "Ja"}] \geq \frac{3}{4} \\ I \notin Y_\Pi & Pr[A(I) \text{ ist "Ja"}] \leq \frac{1}{4} \end{cases}$` </div> <div class="definition">Die Klasse `$\mathcal{RP}$` (randomisiert polynomial) enth&auml;lt alle Entscheidungsprobleme `$\Pi$`, f&uuml;r die es einen polynomialen, randomisierten Algorithmus `$A$` gibt, so dass f&uuml;r alle Instanzen `$I$` von `$\Pi$` gilt: `$ \begin{cases} I \in Y_\Pi & Pr[A(I) \text{ ist "Ja"}] \geq \frac{1}{2} \\ I \notin Y_\Pi & Pr[A(I) \text{ ist "Ja"}] = 0 \end{cases}$` </div> <p>Es gilt: <code>$\mathcal{RP} \subseteq \mathcal{BPP} \subseteq \mathcal{PP}$</code></p> <div class="definition">Die Klasse `$\mathcal{NC}$` (Nick's Class) ist die Klasse der Probleme, die durch einen parallelen Algorithmus `$A$` mit polylogarithmischer Laufzeit und polynomieller Prozessorenzahl gel&ouml;st werden k&ouml;nnen, d.h. `$T_A(n) \in \mathcal{O}((\log n)^k_1)$` mit Konstante `$k_1$` und `$P_A(n) \in \mathcal{O}(n^{k_2})$` mit Konstante `$k_2$`. </div> <div class="definition">Die Klasse `$\mathcal{SC}$` (Steve's Class) ist die Klasse der Probleme, die durch einen sequentiellen Algorithmus mit polylogarithmischem Speicherplatzbedarf und polynomieller Laufzeit gel&ouml;st werden k&ouml;nnen. </div> <h2>&Uuml;bungsbl&auml;tter</h2> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt1.pdf">&Uuml;bungsblatt 1</a>, 06.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung1.pdf">L&ouml;sung</a> <ul> <li>Amortisierte Laufzeitanalyse: Buchungsmethode</li> <li>Was ist ein Netzwerk? Was ist ein Fluss? Was sind die Kapazit&auml;tsbedingung und die Flusserhaltung?</li> </ul></p> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt2.pdf">&Uuml;bungsblatt 2</a>, 13.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung2.pdf">L&ouml;sung</a> <ul> <li>Wie bekommt man aus dem maximalen Fluss den minimalen Schnitt mit Push-Relabel?</li> <li>Berechnung eines Matchings mit hilfe eines MAX-FLOW-Algorithmus.</li> <li>Wie benutze ich den Algorithmus von Stoer und Wagner? <ul> <li>Funktioniert f&uuml;r negative Kantengewichte nicht, z.B. Graph mit 3 Knoten und 2 negativen Kanten.</li> </ul> </li> </ul></p> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt3.pdf">&Uuml;bungsblatt 3</a>, 20.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung3.pdf">L&ouml;sung</a> <ul> <li>Algorithmus von de Pina ausf&uuml;hren (<a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung7.pdf">Vorlesung Nr 7</a>)</li> <li>Einiges zu Kreisbasen</li> <li>Wie bekomme ich mit einem nicht-perfektem M&uuml;nzwurf eine 50%-Wahrscheinlichkeit? &rarr; <a href="http://math.stackexchange.com/q/309003/6876">Antwort</a></li> </ul></p> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt4.pdf">&Uuml;bungsblatt 4</a>, 20.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung4.pdf">L&ouml;sung</a> <ul> <li>Wie finde ich heraus, ob sich zwei gegebene Strecken schneiden? &rarr; <a href="../how-to-check-if-two-line-segments-intersect/" title="How to check if two line segments intersect">Antwort</a></li> </ul></p> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt5.pdf">&Uuml;bungsblatt 5</a>, 22.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung5.pdf">L&ouml;sung</a> <ul> <li>Wie berechnet man den Suffix-Baum und das Suffix-Array von mississippi? &rarr; <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/vorlesung13.pdf">Vorlesung Nr 13</a></li> <li>Wie funktioniert der Rabin-Karp-Algorithmus zum String-Matching?</li> <li>Wie erstellt man einen String-Matching-Automaten?</li> </ul></p> <p><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebungsblatt6.pdf">&Uuml;bungsblatt 6</a>, 24.02.2013: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/uebung6.pdf">L&ouml;sung</a> <ul> <li>Welcher Algorithmus f&uuml;r <span class="smallCaps">Vertex Cover</span> hat eine Approximationsg&uuml;te von 2?</li> </ul></p> <h2>Fakten und interessante Fragen</h2> <ul> <li>Algorithmus ist konservativ `$\Rightarrow$` Algorithmus ist k-kompetitiv. (Quelle: <a href="http://ls2-www.cs.uni-dortmund.de/~sieling/online07/material/online.pdf#page=5">Begleitmaterial zur Vorlesung Online-Algorihmen</a>, Uni Dortmund)</li> <li>`$c(S, V \setminus S) := \sum_{(i,j) \in E,\\i \in S, j \in V \setminus S} c(i,j)$`</li> </ul> <div class="question"> <span class="question">Was ist der Worst-Case f&uuml;r <span class="smallCaps">List Scheduling</span> mit `$m$` Maschinen?</span> <div class="answer"> Gegeben seien `$n \cdot (m-1)$` Jobs &agrave; 1 Sekunde und ein Job mit `$n$` Sekunden. Die Gesamtlaufzeit betr&auml;gt dann `$2 \cdot n - 1$` Sekunden, die beste Laufzeit ist jedoch `$n$` Sekunden. </div> <p></div></p> <div class="question"> <span class="question">Was ist der Worst-Case f&uuml;r <span class="smallCaps">Next Fit</span>?</span> <div class="answer"> `$n$` Elemente mit dem Gewicht `$\frac{1}{2}$` und `$2n$` Elemente mit dem Gewicht `$\frac{1}{2}$` und `$2n$` Elemente mit dem Gewicht `$\frac{1}{2 \cdot n}$`. </div> <p></div></p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Freitag, den 1. M&auml;rz 2013 von 11:00 bis 13:00 (<a href="http://www.informatik.kit.edu/klausuren.php?kid=422.35">Quelle</a>) <strong>Ort</strong>: Tulla-H&ouml;rsaal (Siehe <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/0225raumlisten.pdf">Liste</a>) <strong>Dauer</strong>: 2 Stunden <strong>Punkte</strong>: 60 <strong>Bestehensgrenze</strong>: 20 <strong>&Uuml;bungsschein</strong>: Gibt es nicht. <strong>Bonuspunkte</strong>: Gibt es nicht. <strong>Nicht vergessen</strong>: <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul></p> <h2>Ergebnisse</h2> <p>Der Termin f&uuml;r die Klausureinsicht ist noch nicht bekannt (Stand: 01.03.2013)</p> <p>Seit heute (07.03.2013) sind die Ergebnisse da: <ul> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/klausurid-note.pdf">Ergebnisse</a></li> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2012/algo2/ws1213-1-loesung.pdf">Musterl&ouml;sung</a></li> <li>Termin der Einsicht ist noch nicht bekannt (Stand: 07.03.2013)<br/> Update vom 09.03.2013: Einsicht ist am Dienstag, den 19. Marz von 15:00 bis 17:00 Uhr und am Donnerstag, den 4. April von 15:00 bis 17:00 jeweils in Raum 301 im Infobau 50.34</li> </ul></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/02/algorithmen-2-stats-300x190.png"><img src="../images/2013/02/algorithmen-2-stats-300x190.png" alt="" width="300" height="190" class="size-medium wp-image-62061"/></a><p class="wp-caption-text"></p></div> What can ArrayList / LinkedList do what List can't? http://martin-thoma.com/what-can-arraylist-linkedlist-do-what-list-cant Mon, 04 Feb 2013 10:50:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-can-arraylist-linkedlist-do-what-list-cant <p>I&#39;ve told my students to write</p> <div class="highlight"><pre><code class="java"><span class="n">List</span><span class="o">&lt;</span><span class="n">MyClass</span><span class="o">&gt;</span> <span class="n">myList</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">MyClass</span><span class="o">&gt;();</span> </code></pre></div> <p>instead of</p> <div class="highlight"><pre><code class="java"><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">MyClass</span><span class="o">&gt;</span> <span class="n">myList</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">MyClass</span><span class="o">&gt;();</span> </code></pre></div> <p>as this allows them to switch to any Class that implements List without having to change more code.</p> <p>This does always make sense, except if you need methods from ArrayList or LinkedList. But which methods does <a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html">ArrayList</a> / <a href="http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html">LinkedList</a> offer that <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html">List</a> doesn&#39;t have?</p> <p>ArrayList has: <ul> <li>Object clone()</li> <li>void ensureCapacity(int minCapacity)</li> <li>void removeRange(int fromIndex, int toIndex)</li> <li>void trimToSize()</li> </ul></p> <p>LinkedList has: <ul> <li>void addFirst(E e)</li> <li>void addLast(E e)</li> <li>Object clone()</li> <li>Iterator<E> descendingIterator()</li> <li>E getFirst()</li> <li>E getLast()</li> <li>boolean offer(E e)</li> <li>boolean offerFirst(E e)</li> <li>boolean offerLast(E e)</li> <li>E peek()</li> <li>E peekFirst()</li> <li>E peekLast()</li> <li>E poll()</li> <li>E pollFirst()</li> <li>E pollLast()</li> <li>E pop()</li> <li>void push(E e)</li> <li>E removeFirst()</li> <li>boolean removeFirstOccurrence(Object o)</li> <li>E removeLast()</li> <li>boolean removeLastOccurrence(Object o)</li> </ul></p> Basic Multithreading in Java http://martin-thoma.com/basic-multithreading-in-java Sun, 03 Feb 2013 23:44:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/basic-multithreading-in-java <p>A lot of computing power is wasted in many programs as most programs use only one core. If your program is computation intensive, you might want to put some extra effort in your program and make use of this wasted computing power.</p> <p>There are two ways to execute your code on multiple cores: Multiprocessing and multithreading. Both, processes and threads, provide the possibility to execute code sequences independently and concurrently. But where is the difference? <ul> <li>When you execute code in <strong>multiple processes</strong>, the operating system handles the scheduling. It decides when which process gets executed and tries to find an optimal order. Every process has its own memory segment. A process is sometimes also called &quot;kernel level thread&quot;.</li> <li>When you execute code in <strong>multiple threads</strong>, all threads have one process they belong to (see <a href="http://eliezerciriaco.blogspot.de/2009/07/multi-threading-models.html">Multi-Threading models</a>, also from <a href="http://docs.oracle.com/cd/E19455-01/806-3461/6jck06gqk/index.html">Java</a>). Every set of threads that have the same process share their memory.</li> </ul></p> <p>In Java, you will use multithreading most of the time. I will only write about multithreading, but you can create multiple processes wiht <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html">ProcessBuilder</a>.</p> <h2>Java Basics for Multithreading</h2> <p>All important lessons you need to learn are covered in <a href="http://docs.oracle.com/javase/tutorial/essential/concurrency/">Java Concurrency Tutorial</a>. If you&#39;re really interested in multithreading, you should read this.</p> <p>You can put the part that can get executed concurrently in a separate class that implements the interface <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html">Runnable</a>. This class has a method called run(). You can create a new <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#Thread(java.lang.Runnable)">Thread(Runnable)</a> by calling <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()">start()</a>.</p> <p>Here is an example:</p> <h2>Sum</h2> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Sum</span> <span class="kd">implements</span> <span class="n">Runnable</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">UpperEnd</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">Sum</span><span class="o">(</span><span class="kt">int</span> <span class="n">upperEnd</span><span class="o">)</span> <span class="o">{</span> <span class="n">UpperEnd</span> <span class="o">=</span> <span class="n">upperEnd</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">UpperEnd</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="n">RaceCondition</span><span class="o">.</span><span class="na">bigSum</span><span class="o">++;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Main</h2> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">BIG_NR</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">NR_THREADS</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">long</span> <span class="n">bigSum</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;You should specify the number &quot;</span> <span class="o">+</span> <span class="s">&quot;of threads and BIG_NR. Call me like this:\n&quot;</span> <span class="o">+</span> <span class="s">&quot;java -jar RaceCondition.jar 5 20000\n&quot;</span> <span class="o">+</span> <span class="s">&quot;This will create 5 Threads which try to count&quot;</span> <span class="o">+</span> <span class="s">&quot;up to 2000000.\n&quot;</span> <span class="o">+</span> <span class="s">&quot;-v will show status &quot;</span> <span class="o">+</span> <span class="s">&quot;information &quot;</span><span class="o">);</span> <span class="k">return</span><span class="o">;</span> <span class="o">}</span> <span class="kt">boolean</span> <span class="n">verbose</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="n">verbose</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="o">}</span> <span class="n">NR_THREADS</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span> <span class="n">BIG_NR</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Thread</span><span class="o">&gt;</span> <span class="n">threads</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Thread</span><span class="o">&gt;();</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">NR_THREADS</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="n">Runnable</span> <span class="n">task</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Sum</span><span class="o">(</span><span class="n">BIG_NR</span><span class="o">);</span> <span class="n">Thread</span> <span class="n">worker</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">task</span><span class="o">);</span> <span class="n">worker</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">threads</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">worker</span><span class="o">);</span> <span class="o">}</span> <span class="kt">int</span> <span class="n">running</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">do</span> <span class="o">{</span> <span class="n">running</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="n">Thread</span> <span class="n">thread</span> <span class="o">:</span> <span class="n">threads</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">thread</span><span class="o">.</span><span class="na">isAlive</span><span class="o">())</span> <span class="o">{</span> <span class="n">running</span><span class="o">++;</span> <span class="o">}</span> <span class="o">}</span> <span class="k">if</span> <span class="o">(</span><span class="n">verbose</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Remaining threads: &quot;</span> <span class="o">+</span> <span class="n">running</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">while</span> <span class="o">(</span><span class="n">running</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">RaceCondition</span><span class="o">.</span><span class="na">bigSum</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Call it like this:</p> <div class="highlight"><pre><code class="bash">java Main 5 2000 </code></pre></div> <h2>Race Conditions</h2> <p>When you execute the code above, the output will vary. Why is this the case?</p> <p>In short: The execution order is not defined and <code>RaceCondition.bigSum++</code> is not atomic.</p> <p>Let&#39;s imagine that you call this with two threads only: <code>java Main 2 2000</code></p> <p>Now you could get this execution order: <ul> <li>Thread 1: Loads <code>RaceCondition.bigSum</code>. It is 0.</li> <li>Thread 2: Executes completely. Now <code>RaceCondition.bigSum</code> is 2000</li> <li>Thread 1: Increases the loaded value of <code>RaceCondition.bigSum</code> by 1. Now it is 1.</li> <li>Thread 1: Finishes it&#39;s execution. The Value of <code>RaceCondition.bigSum</code> is 2000 = BIG_NR.</li> </ul></p> <p>Ok, we can obviously get values in <code>$[\text{BIG}\_\text{NR}, \text{NR}\_\text{THREADS} \cdot \text{BIG}\_\text{NR}]$</code>.</p> <p>Can we get smaller values? Yes, we can!</p> <p>Execute:</p> <div class="highlight"><pre><code class="bash">java Main 50 20000 </code></pre></div> <ul> <li>Thread 1 loads <code>bigSum</code>. It's 0.</li> <li>Thread 2 loads <code>bigSum</code>. It's 0.</li> <li>Thread 3 - 50 execute completely.</li> <li>Thread 2 executes until it is at the latest <code>bigSum++</code>. The latest doesn't execute.</li> <li>Thread 1 increases the loaded value from 0 to 1 and writes 1 back</li> <li>Thread 2 loads <code>bigSum</code> = 1</li> <li>Thread 1 executes and finishes.</li> <li>Thread 2 increases the loaded value from 1 to 2 and writes 2 back.</li> </ul> <p>You can get all values in <code>$[2, \text{NR}\_\text{THREADS} \cdot \text{BIG}\_\text{NR}]$</code>!</p> <p>Usually, you don&#39;t want to get different results when you give the same input to your program. How can you fix this? Take a look at <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html">AtomicLong</a> and replace the <code>long bigNr</code> by the <code>AtomicLong bigNr</code>.</p> <h2>Playing with BASH</h2> <p>If you want to execute this more often, you could save it as a executable JAR and execute the following bash script. It takes three arguments: <ul> <li><code>$1: The number of times you execute a the program with a fixed number of THREADS&lt;/li&gt; &lt;li&gt;$</code>2: The maximum number of THREADS you would like to use</li> <li>`$3: BIG_NR</li> </ul></p> <p>The script executes the program $<code>$1 \cdot</code>$2$` times. The output gets divided by the number of threads and the result is saved in raceCondition.tmp. Every line is one execution of the program. When the second number is BIG_NR, then no race conditions occured.</p> <div class="highlight"><pre><code class="bash">rm raceCondition.tmp touch raceCondition.tmp <span class="c"># Up to `$2 threads</span> <span class="k">for</span> <span class="o">((</span> <span class="nv">threads</span><span class="o">=</span>1<span class="p">;</span>threads&lt;<span class="o">=</span><span class="nv">$`</span>2<span class="p">;</span> threads++<span class="o">))</span> <span class="k">do</span> <span class="k"> for</span> <span class="o">((</span> <span class="nv">c</span><span class="o">=</span>1<span class="p">;</span> c&lt;<span class="o">=</span><span class="sb">`</span><span class="nv">$1</span><span class="p">;</span> c++ <span class="o">))</span> <span class="k">do</span> <span class="c"># $`threads threads, count up to `$3 in each thread</span> <span class="nv">thisExecutionSum</span><span class="o">=</span><span class="sb">`</span>java -jar RaceCondition.jar <span class="nv">$`</span>threads <span class="sb">`</span><span class="nv">$3</span><span class="sb">`</span> <span class="c"># Normalize: thisExecutionSum / number of threads</span> <span class="nv">normalizedSum</span><span class="o">=</span><span class="sb">`</span>awk -vsome<span class="o">=</span><span class="nv">$`</span>thisExecutionSum -vtotal<span class="o">=</span><span class="sb">`</span><span class="nv">$threads</span> <span class="s1">&#39;BEGIN { printf(&quot;%d\n&quot;, some/total); exit } &#39;</span><span class="sb">`</span> <span class="nb">echo</span> -e <span class="nv">$`</span>threads<span class="s2">&quot;\t&quot;</span><span class="nv">$normalizedSum</span> &gt;&gt; raceCondition.tmp <span class="k">done</span> <span class="k">done</span> </code></pre></div> Flipflops und Latches http://martin-thoma.com/flipflops-und-latches Wed, 30 Jan 2013 12:12:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/flipflops-und-latches <p>Flipflops und Latches sind 1-bit Datenspeicher. Es gibt sie als synchrone und als asynchrone Varianten, wobei &bdquo;synchron&ldquo; nur bedeutet, dass das Bauteil zus&auml;tzlich einen Takteingang hat. Der wichtigste (und einzige?) Unterschied zwischen Flipflops und Latches ist, dass Flipflops Taktflankengesteuert sind und Latches Pegelgesteuert sind. Das hei&szlig;t, Flipflops k&ouml;nnen nur dann ihren Wert &auml;ndern, wenn der anliegende Takt von 0 auf 1 wechselt. Latches hingegen k&ouml;nnen ihren Wert immer &auml;ndern, wenn der anliegende Takt auf 1 ist. Beide haben die gleichen Ansteuertabellen, k&ouml;nnen aber unterschiedliche Zeitdiagramme haben.</p> <p>Interesannt sind vor allem die Ansteuertabellen. Dabei darf man sich nicht von der Art, wie diese aufgeschrieben werden, verwirren lassen: <code>$q^t$</code> ist der Zustand des Flipflops zum Zeitpunkt <code>$t$</code>. Analog dazu ist <code>$q^{t+1}$</code> der Zustand des Flipflops zum Zeitpunkt <code>$t+1$</code>. Nun steht rechts in der Tabelle, welche Signale man braucht um den Zustand <code>$q^{t+1}$</code> zu erreichen, wenn man im Zustand <code>$q^t$</code> ist.</p> <p>[gallery ids=&quot;55771,55781&quot;]</p> <h2>D-Flipflops</h2> <p><abbr title="Delay-Flipflops">D-Flipflops</abbr> ignorieren im Prinzip den aktuellen Zustand und setzt den neuen Zustand einfach auf das d-Signal.</p> <p>D-Flipflops k&ouml;nnen aus D-Latches erstellt werden: <div style="width: 542px" class="wp-caption aligncenter"><a href="../images/2013/01/d-flipflop.png"><img src="../images/2013/01/d-flipflop.png" alt="" width="542" height="182" class="size-full wp-image-55641"/></a><p class="wp-caption-text"></p></div></p> <h3>Ansteuertabelle</h3> <table> <tr> <td> <table style="width:auto"> <tr> <th style="border-bottom:1px solid black;">`$q^t$`</th> <th style="border-bottom:1px solid black;border-right: 1px solid black;">`$q^{t+1}$`</th> <th style="border-bottom:1px solid black;">`$d^t$`</th> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">0</td> <td>0</td> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">1</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">0</td> <td>0</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">1</td> <td>1</td> </tr> </table> <p></td> <td> <div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2013/01/d-flipflop1-150x150.png"><img src="../images/2013/01/d-flipflop1-150x150.png" alt="" width="150" height="150" class="size-thumbnail wp-image-55781"/></a><p class="wp-caption-text"></p></div> </td> </tr> </table></p> <h2>RS-Flipflops</h2> <p>Das <abbr title="Reset-Set-Flipflop">RS-Flipflop</abbr> bietet zwei M&ouml;glichkeiten: Entweder man resettet es, dann wird der neue Zustand 0, oder man setzt es. Dann ist der neue Zustand 1.</p> <p>Ein RS-Flipflop hat zwei Eing&auml;nge und einen oder zwei Ausg&auml;nge.</p> <h3>Ansteuertabelle</h3> <table> <tr> <td> <table style="width:auto"> <tr> <th style="border-bottom:1px solid black;">`$q^t$`</th> <th style="border-bottom:1px solid black;border-right: 1px solid black;">`$q^{t+1}$`</th> <th style="border-bottom:1px solid black;">`$r^t$`</th> <th style="border-bottom:1px solid black;">`$s^t$`</th> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">0</td> <td>-</td> <td>0</td> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">1</td> <td>0</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">0</td> <td>1</td> <td>0</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">1</td> <td>0</td> <td>-</td> </tr> </table> <p></td> <td> <div style="width: 128px" class="wp-caption aligncenter"><a href="../images/2013/01/rs-flipflop.png"><img src="../images/2013/01/rs-flipflop.png" alt="" width="128" height="128" class="size-full wp-image-55631"/></a><p class="wp-caption-text"></p></div> </td> </tr> </table></p> <h2>T-Flipflop</h2> <p><abbr title="Toggle-Flipflop">T-Flipflops</abbr> wechseln den Zustand, wenn T gesetzt ist.</p> <h3>Ansteuertabelle</h3> <table> <tr> <td> <table style="width:auto"> <tr> <th style="border-bottom:1px solid black;">`$q^t$`</th> <th style="border-bottom:1px solid black;border-right: 1px solid black;">`$q^{t+1}$`</th> <th style="border-bottom:1px solid black;">`$T^t$`</th> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">0</td> <td>0</td> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">1</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">0</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">1</td> <td>0</td> </tr> </table> <p></td> <td> <div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2013/01/t-flipflop-150x150.png"><img src="../images/2013/01/t-flipflop-150x150.png" alt="" width="150" height="150" class="size-thumbnail wp-image-55831"/></a><p class="wp-caption-text"></p></div> </td> </table></p> <h2>JK-Flipflop</h2> <p><abbr title="Jump-/Kill-Flipflops">JK-Flipflops</abbr> haben zwei Eing&auml;nge, &bdquo;J&ldquo; und &bdquo;K&ldquo;. Warum die allerdings Jump und Kill genannt werden, ist mir nicht klar. Habt ihr eine Merkregel f&uuml;r die Ansteuertabelle dieses Flipflops?</p> <h3>Ansteuertabelle</h3> <table> <tr> <td> <table style="width:auto"> <tr> <th style="border-bottom:1px solid black;">`$q^t$`</th> <th style="border-bottom:1px solid black;border-right: 1px solid black;">`$q^{t+1}$`</th> <th style="border-bottom:1px solid black;">`$j^t$`</th> <th style="border-bottom:1px solid black;">`$k^t$`</th> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">0</td> <td>0</td> <td>-</td> </tr> <tr> <td>0</td> <td style="border-right: 1px solid black;">1</td> <td>1</td> <td>-</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">0</td> <td>-</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right: 1px solid black;">1</td> <td>-</td> <td>0</td> </tr> </table> <p></td> <td> <div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2013/01/jk-flipflop-150x150.png"><img src="../images/2013/01/jk-flipflop-150x150.png" alt="" width="150" height="150" class="size-thumbnail wp-image-55851"/></a><p class="wp-caption-text"></p></div> </td> </tr> </table></p> Das Consensus-Verfahren http://martin-thoma.com/das-consensus-verfahren Tue, 29 Jan 2013 15:23:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/das-consensus-verfahren <p>Mithilfe des Consensus-Verfahrens k&ouml;nnen Primimplikanten gefunden werden. Dazu braucht man eine Schaltfunktion <code>$f:\{0,1\}^n \rightarrow \{0,1\}$</code> in disjunktiver Normalform (DNF). Zu betonen ist, dass man keine Minimalform bekommt, da das &Uuml;berdeckungsproblem noch gel&ouml;st werden muss. Dies kann man z.B. mit der <a href="../das-quine-mccluskey-verfahren/" title="Das Quine-McCluskey-Verfahren">zweiten Quineschen Tabelle</a> machen.</p> <p>Dazu baut man eine Tabelle auf. Ich nenne sie mal Consensus-Tabelle. Diese hat 4 Spalten: <ul> <li>Nr.</li> <li>Gebildet aus</li> <li>W&uuml;rfel - eine Spalte f&uuml;r jeden der <code>$n$</code> Parameter der Schaltfunktion <code>$f$</code></li> <li>Gestrichen wegen</li> </ul></p> <p>Nun ergibt jeder Minterm der DNF eine Zeile in der Consensus-Tabelle. Die Reihenfolge ist dabei egal. Die Nr. wird fortlaufend von 1 an gesetzt, die Spalte &bdquo;Gebildet aus&ldquo; bleibt erst mal leer. Nun zieht man eine Linie, um die folgenden Zeilen abzutrennen. Diesen abgetrennten Teil nennen ich nun &bdquo;Block&ldquo;.</p> <p>Man vergleicht nun jede Zeile mit den dar&uuml;ber liegenden Zeilen. <ul> <li><em>: Falls an einer bestimmten Stelle nur eine der Zeilen ein don&#39;t care hat, wird an dieser Stelle der Wert der anderen Zeile genommen. Diese Spalte z&auml;hlt also nicht als unterschiedlich.</li> <li>Unterscheiden sich zwei Zeilen nur an einer Stelle, schreibt man eine neue Zeile in den neuen Block. Diese Zeile hat ein don&#39;t care an der Stelle, an der sich die beiden Zeilen unterschieden, eine eigene Nummer. Eventuell &uuml;berdeckt die neue Zeile beide vorhergehenden. Wegen der don&#39;t care-Regelung (</em>) muss das jedoch nicht der Fall sein.</li> </ul> Sobald man alle Zeilen des vorhergehenden Block &uuml;berpr&uuml;ft hat, kann man wieder eine Linie machen.</p> <p>Das sieht dann etwa so aus (aus Folien von Prof. Dr. Asfour): <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/consensus-verfahren-300x165.png"><img src="../images/2013/01/consensus-verfahren-300x165.png" alt="" width="300" height="165" class="size-medium wp-image-55531"/></a><p class="wp-caption-text"></p></div></p> <p>Wie man sieht, kann es auch sein, dass eine neue Zeile bereits von einer alten &uuml;berdeckt wird. Diese Zeilen kann man also direkt streichen. Sobald man keine neuen Zeilen / Bl&ouml;cke mehr bilden kann, ist man fertig. Die Zeilen, die nicht gestrichen wurden, sind Primimplikanten.</p> <h2>Code</h2> <p>Ich finde Algorithmen werden am eindeutigsten durch Implementierungen beschrieben. Hier ist meine f&uuml;r das Consensus-Verfahren:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">initDatastructure</span><span class="p">(</span><span class="n">terme</span><span class="p">):</span> <span class="n">dictList</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">term</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">terme</span><span class="p">):</span> <span class="n">dictList</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&#39;number&#39;</span><span class="p">:</span> <span class="n">nr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="s">&#39;gebildet&#39;</span><span class="p">:</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="s">&#39;term&#39;</span><span class="p">:</span><span class="n">term</span><span class="p">,</span> <span class="s">&#39;gestrichen&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">})</span> <span class="k">return</span> <span class="n">dictList</span> <span class="sd">&#39;&#39;&#39; check if item1 and item2 differ in at least one digit &#39;&#39;&#39;</span> <span class="k">def</span> <span class="nf">hasComplementaryDigit</span><span class="p">(</span><span class="n">item1</span><span class="p">,</span> <span class="n">item2</span><span class="p">):</span> <span class="n">term1</span> <span class="o">=</span> <span class="n">item1</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="n">term2</span> <span class="o">=</span> <span class="n">item2</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">term1</span><span class="p">)):</span> <span class="k">if</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;1&#39;</span> <span class="ow">and</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;0&#39;</span><span class="p">)</span> <span class="ow">or</span> \ <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;0&#39;</span> <span class="ow">and</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;1&#39;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="bp">False</span> <span class="sd">&#39;&#39;&#39; check if item1 and item2 have a consensus term &#39;&#39;&#39;</span> <span class="k">def</span> <span class="nf">hasConsensus</span><span class="p">(</span><span class="n">item1</span><span class="p">,</span> <span class="n">item2</span><span class="p">):</span> <span class="n">term1</span> <span class="o">=</span> <span class="n">item1</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="n">term2</span> <span class="o">=</span> <span class="n">item2</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="n">differences</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">term1</span><span class="p">)):</span> <span class="k">if</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">):</span> <span class="n">differences</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">differences</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="sd">&#39;&#39;&#39; create the consensus term of two items &#39;&#39;&#39;</span> <span class="k">def</span> <span class="nf">getConsensus</span><span class="p">(</span><span class="n">item1</span><span class="p">,</span> <span class="n">item2</span><span class="p">):</span> <span class="n">term1</span> <span class="o">=</span> <span class="n">item1</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="n">term2</span> <span class="o">=</span> <span class="n">item2</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]</span> <span class="n">consensus</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">term1</span><span class="p">)):</span> <span class="k">if</span> <span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">consensus</span> <span class="o">+=</span> <span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">elif</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">):</span> <span class="n">consensus</span> <span class="o">+=</span> <span class="s">&#39;-&#39;</span> <span class="k">elif</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span><span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">):</span> <span class="n">consensus</span> <span class="o">+=</span> <span class="n">term1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">consensus</span> <span class="o">+=</span> <span class="n">term2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">return</span> <span class="n">consensus</span> <span class="k">def</span> <span class="nf">isIncludedIn</span><span class="p">(</span><span class="n">bigger</span><span class="p">,</span> <span class="n">smaller</span><span class="p">):</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bigger</span><span class="p">)):</span> <span class="k">if</span> <span class="n">bigger</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span> <span class="ow">and</span> <span class="n">bigger</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="n">smaller</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">def</span> <span class="nf">consensusIsIncludedIn</span><span class="p">(</span><span class="n">dictList</span><span class="p">,</span> <span class="n">consensus</span><span class="p">):</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">dictList</span><span class="p">:</span> <span class="k">if</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="bp">False</span> <span class="ow">and</span> \ <span class="n">isIncludedIn</span><span class="p">(</span><span class="n">element</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">],</span> <span class="n">consensus</span><span class="p">):</span> <span class="k">return</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;number&#39;</span><span class="p">]</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">def</span> <span class="nf">printList</span><span class="p">(</span><span class="n">dictList</span><span class="p">,</span> <span class="n">horizontalLinesAfter</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;Nr</span><span class="se">\t</span><span class="s"> Gebildet aus </span><span class="se">\t</span><span class="s"> W&amp;uuml;rfel</span><span class="se">\t</span><span class="s"> Gestrichen wegen&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span><span class="p">,</span> <span class="n">element</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">dictList</span><span class="p">):</span> <span class="k">if</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="k">if</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;number&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;number&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="se">\t\t</span><span class="si">%s</span><span class="se">\t</span><span class="si">%s</span><span class="se">\t</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">element</span><span class="p">[</span><span class="s">&#39;number&#39;</span><span class="p">],</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gebildet&#39;</span><span class="p">],</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">],</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]))</span> <span class="k">if</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">horizontalLinesAfter</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;-&#39;</span><span class="o">*</span><span class="mi">50</span><span class="p">)</span> <span class="k">def</span> <span class="nf">consensus</span><span class="p">(</span><span class="n">terme</span><span class="p">):</span> <span class="n">dictList</span> <span class="o">=</span> <span class="n">initDatastructure</span><span class="p">(</span><span class="n">terme</span><span class="p">)</span> <span class="n">horizontalLinesAfter</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">dictList</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">pointer2</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">nextNumber</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">dictList</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">while</span> <span class="n">pointer2</span> <span class="o">!=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">dictList</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">pointer2</span> <span class="o">&gt;</span> <span class="n">horizontalLinesAfter</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> <span class="n">horizontalLinesAfter</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">dictList</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">dictList</span><span class="p">[</span><span class="n">pointer2</span><span class="p">][</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">False</span><span class="p">:</span> <span class="n">pointer2</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">continue</span> <span class="k">for</span> <span class="n">pointer1</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">pointer2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">dictList</span><span class="p">[</span><span class="n">pointer1</span><span class="p">][</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">False</span><span class="p">:</span> <span class="k">continue</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">hasComplementaryDigit</span><span class="p">(</span><span class="n">dictList</span><span class="p">[</span><span class="n">pointer1</span><span class="p">],</span> <span class="n">dictList</span><span class="p">[</span><span class="n">pointer2</span><span class="p">]):</span> <span class="k">continue</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">hasConsensus</span><span class="p">(</span><span class="n">dictList</span><span class="p">[</span><span class="n">pointer1</span><span class="p">],</span> <span class="n">dictList</span><span class="p">[</span><span class="n">pointer2</span><span class="p">]):</span> <span class="k">continue</span> <span class="n">consensus</span> <span class="o">=</span> <span class="n">getConsensus</span><span class="p">(</span><span class="n">dictList</span><span class="p">[</span><span class="n">pointer1</span><span class="p">],</span> <span class="n">dictList</span><span class="p">[</span><span class="n">pointer2</span><span class="p">])</span> <span class="c"># Wird der neue Konsensus-Term eventuell bereits &amp;uuml;berdeckt?</span> <span class="n">gestrichen</span> <span class="o">=</span> <span class="n">consensusIsIncludedIn</span><span class="p">(</span><span class="n">dictList</span><span class="p">,</span> <span class="n">consensus</span><span class="p">)</span> <span class="k">if</span> <span class="n">gestrichen</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="n">nr</span> <span class="o">=</span> <span class="n">nextNumber</span> <span class="n">nextNumber</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">nr</span> <span class="o">=</span> <span class="bp">False</span> <span class="c"># Kann dank dem neuen Consensus-Term etwas gestrichen werden?</span> <span class="k">if</span> <span class="n">gestrichen</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">dictList</span><span class="p">:</span> <span class="k">if</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="bp">False</span> <span class="ow">and</span> \ <span class="n">isIncludedIn</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;term&#39;</span><span class="p">]):</span> <span class="n">element</span><span class="p">[</span><span class="s">&#39;gestrichen&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">nr</span> <span class="n">dictList</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s">&#39;number&#39;</span> <span class="p">:</span> <span class="n">nr</span><span class="p">,</span> <span class="s">&#39;gebildet&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">dictList</span><span class="p">[</span><span class="n">pointer2</span><span class="p">][</span><span class="s">&#39;number&#39;</span><span class="p">])</span> <span class="o">+</span> <span class="s">&#39;, &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">dictList</span><span class="p">[</span><span class="n">pointer1</span><span class="p">][</span><span class="s">&#39;number&#39;</span><span class="p">]),</span> <span class="s">&#39;term&#39;</span><span class="p">:</span> <span class="n">consensus</span><span class="p">,</span> <span class="s">&#39;gestrichen&#39;</span> <span class="p">:</span> <span class="n">gestrichen</span><span class="p">})</span> <span class="n">pointer2</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">printList</span><span class="p">(</span><span class="n">dictList</span><span class="p">,</span> <span class="n">horizontalLinesAfter</span><span class="p">)</span> <span class="n">consensus</span><span class="p">([</span><span class="s">&#39;-0-00&#39;</span><span class="p">,</span> <span class="s">&#39;--00-&#39;</span><span class="p">,</span> <span class="s">&#39;-1-00&#39;</span><span class="p">,</span> <span class="s">&#39;010-1&#39;</span><span class="p">,</span> <span class="s">&#39;1-11-&#39;</span><span class="p">,</span> <span class="s">&#39;110-1&#39;</span><span class="p">])</span> <span class="c">#consensus([&#39;-00-&#39;, &#39;-011&#39;, &#39;0100&#39;])</span> </code></pre></div> <p>Ausgabe:</p> <div class="highlight"><pre><code class="text">Nr Gebildet aus W&amp;uuml;rfel Gestrichen wegen 1 -0-00 7 2 --00- 3 -1-00 7 4 010-1 9 5 1-11- 6 110-1 9 -------------------------------------------------- 7 3, 1 ---00 8 6, 5 11-11 9 6, 4 -10-1 -------------------------------------------------- 10 7, 5 1-1-0 8, 2 110-1 9 9, 7 -100- 2 9, 5 11-11 8 -------------------------------------------------- 10, 8 1111- 5 10, 2 1--00 7 -------------------------------------------------- </code></pre></div> <h2>Quellen</h2> <p>Die Folien von Dr. Asfour (DT-VL12) sowie die Vorlesung (auf <a href="http://www.youtube.com/watch?v=K1NAj4ecPDw#t=31m18s">YouTube</a> verf&uuml;gbar. Der <a href="http://www.youtube.com/watch?v=K1NAj4ecPDw#t=47m30s">interessante Teil</a> beginnt erst sehr sp&auml;t.). Es wurde sogar <a href="http://www.youtube.com/watch?v=4X1w0B4w65k#t=1h10m38s">sp&auml;ter nochmals von Herrn Prof. Dr. Asfour erkl&auml;rt</a>.</p> Das Quine-McCluskey-Verfahren http://martin-thoma.com/das-quine-mccluskey-verfahren Tue, 29 Jan 2013 13:34:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/das-quine-mccluskey-verfahren <p>Das Quine-McCluskey-Verfahren wird angewendet, wenn man eine Schaltfunktion minimieren will. Es muss also eine Schaltfunktion gegeben sein. Es sollte eigentlich zus&auml;tzlich Kostenfunktion gegeben sein, aber meist ist das nicht der Fall.</p> <h2>Verfahren</h2> <p><strong>Gegeben</strong>: Eine Schaltfunktion <code>$f:\{0,1\}^n \rightarrow \{0,1\}, \; n \in \mathbb{N}$</code> <strong>Schritt 1:</strong> Aufstellen der Funktionstabelle. Sie hat die Spalten <ul> <li>&bdquo;Nr.&ldquo;, die bei 0 beginnt und bis <code>$2^n - 1$</code> geht.</li> <li>Eine Spalte pro Funktionsparameter (z.B. <code>$a, b, c, ...$</code>)</li> <li>Eine Spalte f&uuml;r den Funktionswert <code>$f(a,b,c,...)$</code></li> </ul></p> <p><strong>Schritt 2</strong>: Aufstellen der ersten Quinesche Tabelle 0ter Ordnung. </p> <p>Sie hat die Spalten <ul> <li>&bdquo;Nr.&ldquo;</li> <li>Eine Spalte pro Parameter</li> <li>&bdquo;✓&ldquo; (H&auml;kchen)</li> </ul> In der ersten Quineschen Tabelle stehen nur noch die Zeilen, deren Funktionswert 1 ist. Das sind die sogenannten Minterme. Zus&auml;tzlich sind sie nach Anzahl der 1er geordnet.</p> <p><strong>Schritt 3</strong>: <code>$i$</code>-tes Zusammenfassen</p> <p>Nun erstellt man die erste Quinesche Tabelle <code>$i$</code>-ter Ordnung. Also beim ersten mal erster Ordnung, beim zweiten Mal zweiter Ordnung, ... Diese Tabellen haben alle die gleichen Spalten und die Zeilen-Anzahl kann sowohl wachsen als auch schrumpfen. Das <code>$i$</code> gibt dabei die Anzahl der &bdquo;don&#39;t care&ldquo; Stellen an, also der Stellen die sowohl 0 als auch 1 sein k&ouml;nnen.</p> <p>Um aus der ersten Quinesche Tabelle <code>$(i-1)$</code>-ter Ordnung die rsten Quinesche Tabelle <code>$i$</code>-ter Ordnung zu erstellen, geht man wie folgt vor: <ul> <li>Vergleiche alle Zeilen, in denen sich die Anzahl der 1er um genau 1 unterscheidet: <ul> <li>Unterscheiden sich Zeile Nr. x und Zeile Nr. y an nur einer Stelle, so schreibe in die Tabelle <code>$i$</code>ter Ordnung eine neue Zeile. Die Nummer dieser Zeile ist &bdquo;x, y&ldquo; und sie hat an der Stelle, an der sich die Zeilen x und y unterschieden, ein don&#39;t care.</li> <li>Hake die Zeilen x und y in der Tabelle <code>$(i-1)$</code>-ter Ordnung ab</li> </ul> </li> </ul></p> <p>Es ist m&ouml;glich, das Zeilen nicht abgehakt werden, weil sie sich mit keiner Zeile zusammenfassen lassen. Das ist ok. Sobald in einem Schritt keine Zusammenfassung mehr m&ouml;glich ist, ist man hier fertig. Falls noch eine M&ouml;glich ist, geht man wieder in Schritt 3.</p> <p>Nun schreibt man alle Zeilen auf, die nicht abgehakt sind. Das sind die Primimplikanten.</p> <p><strong>Schritt 4</strong>: Aufstellen der zweiten Quineschen Tabelle</p> <p>Die zweite Quinesche Tabelle (auch &Uuml;berdeckungstabelle genannt) hat folgende Spalten: <ul> <li>Primimplikanten</li> <li>Eine Spalte pro Minterm. Die Beschriftung ist dabei eine Nr.</li> <li>Eine Spalte &bdquo;Kosten&ldquo;</li> </ul></p> <p>Nun macht man in den Zellen ein Kreuz, in denen der Primimplikant den Minterm abdeckt (also wenn die Nr. im Namen des Minterms vorkommt). Die Kosten muss man pro Primimplikant berechnen.</p> <p><strong>Schritt 5</strong>: Vereinfachen der zweiten Quineschen Tabelle</p> <p>Dieser Schritt erinnert mich irgendwie an Sudoku. <ul> <li><em>Zeilendominanz</em>: Hat eine Zeile a nur x-e an Stellen, wo auch eine andere Zeile b x-e hat und ist Zeile b nicht teurer als a, so kann Zeile a gestrichen werden. Also: Es wird die Zeile mit weniger x gestrichen</li> <li><em>Spaltendominanz</em>: &Uuml;berdeckt eine Spalte eine andere Spalte mit ihren x-en, so kann die Spalte mit <u>mehr</u> x-en gestrichen werden.</li> </ul></p> <p><strong>Schritt 6</strong>: Identifizieren von Kernprimimplikanten.</p> <p>Wenn eine Zeile als einzige an einer bestimmten Spalte ein x hat, ist der zugeh&ouml;rige Primimplikant ein Kernprimimplikant. Er muss auf jeden Fall in der Minimalform vorkommen. Diesen schreibt man sich also auf, Streicht die Zeile und alle Spalten, an denen der Kernprimimplikant ein x hatte. Dann geht man zur&uuml;ck zu Schritt 5.</p> <p>Gab es keinen Kernprimimplikanten, geht man zu Schritt 7.</p> <p><strong>Schritt 7</strong>: Handarbeit</p> <p>Ich muss mal nach einem Beispiel suchen, aber ich glaube es ist m&ouml;glich, dass man die zweite Quinesche Tabelle ab einem gewissen Punkt nicht mehr vereinfachen kann, aber dennoch Zeilen und Spalten &uuml;brig sind. Dann muss man &bdquo;durch scharfes Hinsehen&ldquo; (also Brute-Force) die Minimalform finden, oder? Hier bin ich mir nicht ganz sicher.</p> <h2>Beispiele</h2> <p>Die folgende Aufgabe ist vom &Uuml;bungsblatt 7 (WS 2012/2013). Herr Terlemez hat mir freundlicherweise erlaubt, sie hier verwenden zu d&uuml;rfen. (Die <a href="http://ti.ira.uka.de/TI-1/Uebungen/Uebungen.php">offiziellen Aufgaben und L&ouml;sungen</a> sind passwortgesch&uuml;tzt.)</p> <p><strong>Aufgabe</strong>: Gegeben sei die Schaltfunktion</p> <p><code>$g(d,c,b,a) := dc \bar b a \lor d \bar c ba \lor d \bar c \bar b a \lor \bar d ca \lor dcb$</code></p> <ol> <li>Bestimmen Sie alle Primimplikanten von `$g$` mit Hilfe der 1. Quineschen Tabelle des Quine-McCluskey-Verfahrens.</li> <li>Geben Sie die &Uuml;berdeckungstabelle (2. Quinesche Tabelle) f&uuml;r die gefundenen Primimpikanten an (ohne Vereinfachung). Lesen Sie eine disjunktive Minimalform von `$g$` ab.</li> </ol> <p><strong>L&ouml;sung</strong>: (Habe gerade leider keine Zeit, diese abzutippen. Kommt vielleicht noch.) <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/digitaltechnik-aufgabe-7-2-1-300x236.jpg"><img src="../images/2013/01/digitaltechnik-aufgabe-7-2-1-300x236.jpg" alt="" width="300" height="236" class="size-medium wp-image-56641"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/digitaltechnik-aufgabe-7-2-2-300x253.jpg"><img src="../images/2013/01/digitaltechnik-aufgabe-7-2-2-300x253.jpg" alt="" width="300" height="253" class="size-medium wp-image-56651"/></a><p class="wp-caption-text"></p></div> <h2>Quellen</h2> <p>Ich habe diesen Artikel mit meinem Wissen aus den Folien (DT-VL12), der <a href="http://www.youtube.com/watch?v=K1NAj4ecPDw&list=PL025B377F9094FCB9&index=13">Vorlesung</a> und dem Tutorium erstellt. </p> TI-Klausur (DT & RO) http://martin-thoma.com/ti-klausur-dt-ro Sun, 27 Jan 2013 23:25:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ti-klausur-dt-ro <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesungen &bdquo;Digitaltechnik und Entwurfsverfahren&ldquo; sowie &bdquo;Rechnerorganisation&ldquo; des Moduls &bdquo;Technische Informatik&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe die Vorlesungen bei Herrn Prof. Dr. Asfour geh&ouml;rt.</div> <h2>Vorbereitung DT</h2> <p><strong>Themen</strong>: <ul> <li>Zahlensysteme: Horner-Schema, Euklidischer Algorithmus</li> <li>Zahlendarstellungen: Wie wandle ich eine Zahl von 10-er-System ins Zahlensystem xy um und umgekehrt? <ul> <li>Vorzeichen</li> <ul> <li>Betrag-Vorzeichen &rarr; <span class="hint" title="Erstes Bit ist 1, wenn die Zahl negativ ist. Sonst wird die Zahl einfach bin&auml;r dargestellt.">Antwort</span></li> <li>Einer-Komplement &rarr; <span class="hint" title="Betrag der Zahl dual darstellen, bits invertieren">Antwort</span></li> <li>Zweier-Komplement &rarr; <span class="hint" title="Wie Einer-Komplement, 1 addieren">Antwort</span></li> <li>Exzess-q &rarr; <span class="hint" title="Man fasst die durch Exzess-q dargestellte Zahl als Bin&auml;rzahl auf, addiert -q darauf und erh&auml;lt so die dargestellte Zahl">Antwort</span></li> </ul> </li> <li>Komma <ul> <li>Festkomma &rarr; <span class="hint" title="int, long, char">Beispiele</span></li> <li>Gleitkomma &rarr; <span class="hint" title="float, double">Beispiele</span> (<code>$\pm \text{Mantisse} \cdot b^\text{Exponent}$</code>)</li> </ul> </li> </ul> </li> <li>IEEE 754 Format <ul> <li><a href="../a-practical-approach-to-floats/">A practical approach to floats</a></li> <li>Wie wird NaN dargestellt? Wie wird <code>$-\infty$</code> und <code>$+\infty$</code> dargestellt?</li> <li>Was ist eine normalisierte Zahl, was eine denormalisierte?</li> </ul> </li> <li>Was ist <span class="hint" title="Alle Ziffern von 0-9 werden im 2er-System dargestellt.">BCD</span>, <span class="hint" title="Die Ziffern von 0-4 werden im 2er-System dargestellt. Dann geht es bei (B)_16 = 1011 weiter.">AIKEN</span> und <span class="hint" title="+3 auf jede Ziffer, dann wie BCD">STIBITZ</span>? Wie werden die Ziffern von 0 - 9 dort dargestellt?</li> <li>Was sind Hamming-Codes? &rarr; <a href="../error-correcting-codes/">Antwort</a></li> <li>Wie lauten die Huntingtonschen Axiome? &rarr; <a href="../beweise-aus-der-booleschen-algebra/">Antwort</a></li> <li>Nenne 3 verschiedene vollst&auml;ndige Operatorensysteme. &rarr; <span class="hint" title="(UND, ODER, NOT), (NAND), (NOR)">Antwort</span></li> <li>Was sind Primterme, Primimplikanten, Primimplikate, Minterme und Maxterme?</li> <li>Was sind DMF, DNF, KMF, KNF?</li> <li>Wie wende ich die Shannon-Zerlegung an? &rarr; <a href="../wie-wende-ich-die-shannon-zerlegung-an/">Antwort</a></li> <li>Wie minimiere ich Funktionen mit KV-Diagrammen?</li> <li>Wie funktioniert das Quine-McCluskey Verfahren? &rarr; <a href="../das-quine-mccluskey-verfahren/">Antwort</a></li> <li>Was macht das Consensus-Verfahren? &rarr; <a href="../das-consensus-verfahren/">Antwort</a></li> <li>Wie funktioniert das Nelson-Verfahren?</li> <li>Was bedeutet selbstleitend und selbstsperrend?</li> <li>Was ist <abbr title="metal-oxide-semiconductor field-effect transistor">MOSFET</abbr>? &rarr; <a href="http://commons.wikimedia.org/wiki/File:N-Kanal-MOSFET_(Schema).svg">Aufbau</a></li> <li><abbr title="Complementary Metal Oxide Semiconductor">CMOS</abbr>, N-MOS, P-MOS</li> <li>Was ist der Unterschied zwischen einem Hasard und einem Hasard-Fehler?</li> <li>Woran erkennt man Funktionshasards, woran Strukturhasards?</li> <li>Wie lauten die Ansteuertabellen von D-, T-, JK- und RS-Flipflops? &rarr; <a href="../flipflops-und-latches/">Antwort</a></li> <li>Was macht ein Carry-ripple-Addierer? &rarr; <span class="hint" title="Nutzt zur Addition zweier n-Stelliger Zahlen (n-1) Volladdierer und einen Halbaddierer.">Antwort</span></li> <li>Inwiefern stellt der Carry-lookahead-Addierer eine Verbesserung des Carry-ripple-Addierers dar? &rarr; <span class="hint" title="Der Carry-ripple-Addierer rechnet von dem LSB zu dem MSB Schritt f&uuml;r Schritt. Der Carry-Lookahead-Addierer versucht dies zu beschleunigen, indem er die &Uuml;bertr&auml;ge direkt aus den Eingangsvariablen berechnet.">Antwort</span></li> <li>Was macht man, wenn bei der Addition zweier BCD-Zahlen eine Pseudotetrade auftritt? &rarr; <span class="hint" title="6 auf die betroffene Tetrade addieren.">Antwort</span></li> <li>Was macht man, wenn bei der Addition zweier BCD-Zahlen ein &Uuml;bertrag in die n&auml;chste BCD-Ziffer auftritt? &rarr; <span class="hint" title="6 auf die Stelle addieren, die den &Uuml;bertrag auf die n&auml;chste Stelle verursachte.">Antwort</span></li> <li>Was macht man, wenn bei der Addition zweier BCD-Zahlen bei der Korrekturaddition ein &Uuml;bertrag auftrat? &rarr; <span class="hint" title="Nichts.">Antwort</span></li> <li>Was ist die PPS-Methode? &rarr; <span class="hint" title="Eine Multiplikationsmethode (Partial Product sum). Siehe DT-VL21.pdf">Antwort</span></li> </ul></p> <h2>Vorbereitung RO</h2> <p><strong>Themen</strong>: <ul> <li>Y-Diagramm</li> <li>Aufbau eines Mikroprozessors</li> <li>Umrechnen von Zahlensystemen</li> <li>RAM-Typen (DRAM, FPM-DRAM, EDO-RAM, SDRAM, DDRAM, DDR-SDRAM, RDRAM)</li> <li>Cache-Speicher</li> </ul></p> <p><strong>Begriffe</strong> <ul> <li>Was sind Tristate-Treiber? &rarr; <span class="hint" title="Gatterform, die nicht nur Hi und Lo weiterleiten kann, sondern auch einen dritten, gegen Spannungen beider Polarit&auml;ten, hochohmigen Zustand haben k&ouml;nnen. Dadurch kann z.B. ein Baustein vom Bus abgetrennt werden. Sie dienen zum Abschalten des gleichzeitigen Zugriffs mehrerer Komponenten auf Systembusse.">Antwort</span></li> <li>Was ist der Unterschied zwischen <span class="hint" title="Symbolische Repr&auml;sentation der Maschinensprache, die f&uuml;r den Menschen verst&auml;ndlich und anschaulich ist, z.B. add `$s2, $`s1, `$s0">Assembler</span>, <span class="hint" title="Repr&auml;sentation von Anweisungen, die f&uuml;r einen Mikroprozessor unmittelbar verst&auml;ndlich sind, z.B. 00000000110000100011000000100001">Maschinensprache</span> und Mikrobefehlen?</li> <li>Wof&uuml;r stehen RISC und CISC und was sind Beispiele? &rarr; <span class="hint" title="Reduced Instruction Set Computer (z.B. MIPS), Complex Instruction Set Computer (z.B. x86)">Antwort</span></li> <li>Was ist ein User/System Bit, was ein Trace Bit und was ein Decimal bit? &rarr; <span class="hint" title="Das User/System bit bestimmt, ob sich das System im eingeschr&auml;nkten User-Modus oder im uneingeschr&auml;nktem Systemmodus befindet. Das Trace Bit erlaubt Befehlsabarbeitung im Einzelschritt-Modus zum Debuggen und das Decimal Bit entscheidet, ob Dual oder BCD gerechnet wird.">Antwort</span></li> <li>Welche Informationen k&ouml;nnen im Statusregister des Rechnewerkes stehen? &rarr; <span class="hint" title="Carry, Overflow, Zero, Sign, ...">Antwort</span></li> <li>Welche Informationen k&ouml;nnen im Akkumulator stehen? &rarr; <span class="hint" title="alle ALU Ergebisse">Antwort</span></li> <li>Warum ben&ouml;tigt die ALU Hilfsregister? &rarr; <span class="hint" title="Ohne die Hilfsregister w&uuml;rden w&auml;hrend der ALU-Rechenzeit durch Hasards und Wettl&auml;ufe Schwankungen am Ausgang entstehen.">Antwort</span></li> <li>Entspricht das logische Rechtsschieben der Division durch zwei? &rarr; <span class="hint" title="Nein, da bei negativen Zahlen die 1 im MSB erhalten werden muss.">Antwort</span></li> <li>Was ist ein superskalarer Prozessor? &rarr; <span class="hint" title="Ein Prozessor, der pro Takt mehrere allgemeine Register schreiben und lesen kann.">Antwort</span></li> <li>Was ist ein little Endian und was ist big Endian? &rarr; <span class="hint" title="Das MSB bei little Endian ist ganz links, bei big Endian ganz rechts.">Antwort</span></li> <li>Was versteht man unter dem Nulladressformat? &rarr; <span class="hint" title="Die Befehlss&auml;tze, die nur aus dem Opcode bestehen. Das Einadressformat hat z.B. zus&auml;tzlich noch die Src.">Antwort</span></li> <li>Was ist eine &bdquo;effektive Adresse&ldquo;? &rarr; <span class="hint" title="Die Effektive Adresse ist die durch die Addressierungsart spezifizierte Adresse im Hauptspeicher. Sie entsteht im Prozessor nach Ausf&uuml;hrung der Adressierung.">Antwort</span></li> <li>Was bedeutet <span class="hint" title="Zero flag; Wichtig f&uuml;r Schleifen">ZF</span>, <span class="hint" title="Carry flag; set if an arithmetic operation generats a carry or a borrow out of the MSB of the result">CF</span>, <span class="hint" title="Sign flag; set equal to the MSB">SF</span>, <span class="hint" title="Overflow flag; set if the integer result is too large a positive number or too small a negative number to fit in the destination operand">OF</span> und wozu sind sie jeweils gut?</li> <li>Was ist eine Load/Store-Architektur? &rarr; <abbr title="Eine Load/Store Architektur ist eine Computerarchitektur, deren Befehlssatz Daten-Speicherzugriffe ausschlie&szlig;lich mit speziellen Lade- und Speicher-Befehlen erlaubt.">Antwort</abbr></li> <li>Was sind die f&uuml;nf Schritte in der DLX-Pipeline-Verarbeitung? &rarr; <abbr title="IF: Instruction fetch; ID/RF: Instruction decode/Register fetch; EX: Execute / address calculation; MEM: Memory access; WB: Write Back">Antwort</abbr></li> <li>In welcher Pipeline-Phase werden die Operanden aus dem memory geholt? &rarr; <abbr title="Tja, das war fies. Es ist nicht die MEM-Phase. In der MEM-Phase wird der Speicherzugriff von Lade- und Speicherbefehlen durchgef&uuml;hrt. Richtig ist: Die zweite Takth&auml;lfte der ID-Phase.">Antwort</abbr></li> <li>Durch welche Abh&auml;ngigkeiten entstehen Verz&ouml;gerungen in der DLX-Pipeline und wann treten diese auf? &rarr; <abbr title="Daten-, Struktur- und Steuerflussabh&auml;ngigkeiten. Datenabh&auml;ngigkeiten treten auf, wenn ein Operand noch nicht verf&uuml;gbar ist. Strukturkonflikte treten auf, wenn zwei Pipeline-Stufen dieselbe Ressource ben&ouml;tigen, auf diese aber nur einmal zugegriffen werden kann. Steuerflusskonflikte treten bei Programmsteuerbefehlen auf. Dies kann z.B. der Fall sein wenn in der Holphase die Zieladresse des als n&auml;chstes auszuf&uuml;hrenden Befehls noch nicht berechnet ist oder wenn bei einem bedingtem Sprung noch nicht klar ist, ob dieser &uuml;berhaupt umgesetzt werden wird.">Antwort</abbr></li> <li>Was ist eine echte Datenabh&auml;ngigkeit, was eine Gegenabh&auml;ngigkeit und was eine Ausgabeabh&auml;ngigkeit? &rarr; <abbr title="Echte Datenabh&auml;ngigkeit: a = b + c; d = a + e. Gegenabh&auml;ngigkeit: b = a + c; a = d + e. Ausgabeabh&auml;ngigkeit: a = b + c; a = d + e">Antwort</abbr></li> <li>Was ist eine falsche Abh&auml;ngigkeit? &rarr; <abbr title="Eine Gegen- oder Ausgabeabh&auml;ngigkeit.">Antwort</abbr></li> <li>Treten bei echten Abh&auml;ngigkeiten immer Konflikte auf? &rarr; <abbr title="Nein. Es k&ouml;nnen z.B. gen&uuml;gend Befehle zwischen den beiden Abh&auml;ngigen sein.">Antwort</abbr></li> <li>Welche Konflikte gibt es und wann k&ouml;nnen sie auftreten? &rarr; <abbr title="Read-after-Write: Echte Abh&auml;ngigkeit; Write-after-Read: Gegenabh&auml;ngigkeit; Write-after-Write: Ausgabeabh&auml;ngigkeit">Antwort</abbr></li> <li>Welche Abh&auml;ngigkeiten k&ouml;nnen bei der DLX-Pipeline zu Konflikten f&uuml;hren? &rarr; <abbr title="Nur echte Abh&auml;ngigkeiten k&ouml;nnen in der DLX-Pipeline zu Konflikten f&uuml;hren.">Antwort</abbr></li> <li>Wie kann man Datenkonflikte durch Software l&ouml;sen? &rarr; <abbr title="Entweder durch einf&uuml;gen von nops (Leeroperationen) oder durch Umordnung der Befehle (Optimierung)">Antwort</abbr></li> <li>Wie kann man Datenkonflikte durch Hardware l&ouml;sen? &rarr; <abbr title="Interlocking oder stalling (Pipeline-Sperrung oder Pipeline-Leerlauf); Forwarding, ben&ouml;tigt aber noch interlocking">Antwort</abbr></li> <li>Nennen Sie ein Beispiel f&uuml;r einen Konflikt, der nicht durch Forwarding l&ouml;stbar ist? &rarr; <abbr title="load r2, B; add r2, r1, r2">Antwort</abbr></li> <li>Wie kann man Ressourcenkonflikte l&ouml;sen? &rarr; <abbr title="Arbitrierung mit Interlocking; &Uuml;bertaktung; Ressourcenreplizierung">Antwort</abbr></li> <li>Was bedeutet <span class="hint" title="Minimale Zeitdauer, die zwischen der fallenden Flanke von RAS bis zur Ausgabe der gew&uuml;nschten Daten vergeht">t<sub>RAC</sub></span>, <span class="hint" title="Minimale Zeitdauer von Beginn eines Zeilenzugriffs bis zum n&auml;chsten Zeilenzugriff (Zykluszeit)">t<sub>RC</sub></span>, <span class="hint" title="Minimale Zeitdauer, die zwischen der fallenden Flanke von CAS bis zur Ausgabe der gew&uuml;nschten Daten vergeht">t<sub>CAC</sub></span> und <span class="hint" title="Minimale Zeitdauer vom Beginn eines Spaltenzugriffs bis zum n&auml;chsten Spaltenzugriff (page mode cycle).">t<sub>PC</sub></span>?</li> <li>Wie versteht man unter Bus-Schn&uuml;ffeln? &rarr; <abbr title="Jeder Prozessor kontrolliert st&auml;ndig alle Adressen auf dem Bus um Speicherinkonsistenzen zu vermeiden. Siehe Bus snooping.">Antwort</abbr></li> </ul></p> <h3>MIPS</h3> <h4>Befehlsformate</h4> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/mips-befehlsformate-300x136.png"><img src="../images/2013/01/mips-befehlsformate-300x136.png" alt="" width="300" height="136" class="size-medium wp-image-62151"/></a><p class="wp-caption-text"></p></div> <p>Typ-R Befehle sind arithmetisch-logische Befehle wie add, sub, and, or sowie Vergleichsbefehle wie <abbr title="set on less than">slt</abbr>.</p> <p>Typ-I Befehle sind Lade- und Speicherbefehle sowie Verzweigungsbefehle: <code>lw $<code>rt, imm(</code>$rs)</code> <code>sw $<code>rt, imm(</code>$rs)</code> <code>beq $<code>rs,</code>$rt, immediate</code>: Hier wird immediate als 16-Bit vorzeichenbehaftete Zahl interpretiert und als Offset benutzt. Die Basisadresse ist dabei im PC. Also lautet die Zieladresse: (PC zum Zeitpunkt des Befehls + 4) + immediate</p> <h4>Grundlegende Befehle</h4> <table> <thead> <tr> <th>Syntax</th> <th>Erkl&auml;rung</th> </tr> </thead> <tbody> <tr> <td>li $`t0, 9</td> <td>load immediate: L&auml;dt eine Konstante in ein Register</td> </tr> <tr> <td>sll `$rd, $`rd, shamt</td> <td>shift left logical: `$rd = $`rs << shamt</td> </tr> <tr> <td>ble Rsrc1, Src2, label</td> <td>Branch on Less Than Equal: Rsrc1 &le; Src2</td> </tr> <tr> <td>bne `$rs, $`rt, imm</td> <td>Branch on not equal: if(`$rs!=$`rt) PC = PC + imm (imm could also be a label)</td> </tr> <tr> <td>slti `$rt, $`rs, imm</td> <td>Store less than immediate: if(`$rs < imm) {$`rt = 1;} else {$rt = 0}</td> </tr> <tr> <td>la Rdest, address</td> <td>Load computed address, not the contents of the location, into register Rdest</td> </tr> </tbody> </table> <h3>MiMa</h3> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/mima-microbefehlsformat-300x35.png"><img src="../images/2013/01/mima-microbefehlsformat-300x35.png" alt="" width="300" height="35" class="size-medium wp-image-62571"/></a><p class="wp-caption-text"></p></div> <h4>Fetch-Phase</h4> <p>In der Fetch-Phase muss das die neue Instruktion ins <abbr title="Instruktionsregister">IR</abbr> geladen werden und der <abbr title="Program counter">PC</abbr> um eins erh&ouml;ht werden:</p> <ol> <li>Takt: IAR &rarr; SAR; IAR &rarr; X; R = 1</li> <li>Takt: Eins &rarr; Y; ALU auf addieren; R = 1</li> <li>Takt: ALU auf addieren; R = 1</li> <li>Takt: Z &rarr; IAR</li> <li>Takt: SDR &rarr; IR</li> </ol> <p>Das zugeh&ouml;rige Mikroprogramm ist:</p> <div class="highlight"><pre><code class="text">0010 0001 0000 1000 1000 0000 0001 0001 0100 0000 0000 1000 0000 0010 0000 0000 0000 0001 1000 0000 0011 0000 1010 0000 0000 0000 0000 0100 0000 0000 1001 0000 0000 0000 0101 </code></pre></div> <h2>Fragen</h2> <div class="question"> <span class="question">Zeichnen Sie ein Y-Diagramm.</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/y-diagramm-300x206.png"><img src="../images/2013/01/y-diagramm-300x206.png" alt="" width="300" height="206" class="size-medium wp-image-61531"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie ist ein Von-Neumann-Rechner aufgebaut?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/von-neumann-architektur-300x228.png"><img src="../images/2013/01/von-neumann-architektur-300x228.png" alt="" width="300" height="228" class="size-medium wp-image-61711"/></a><p class="wp-caption-text"></p></div> Das Steuerwerk wird auch &bdquo;Leitwerk&ldquo; genannt, das Rechenwerk auch &bdquo;<strong>A</strong>rithmetic <strong>L</strong>ogic <strong>U</strong>nit&ldquo;. Der BUS beinhaltet Adress-, Daten- und Steuerleitungen. Im Gegensatz zur Harvard-Architektur wird beim Speicher in der Von-Neumann-Architektur nicht zwischen Daten und Programmen unterschieden. </div> <p></div></p> <div class="question"> <span class="question">Wie ist ein Mikroprozessor aufgebaut?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/aufbau-mikroprozessor-300x212.png"><img src="../images/2013/01/aufbau-mikroprozessor-300x212.png" alt="" width="300" height="212" class="size-medium wp-image-61841"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Aus welchen Phasen besteht die Befehlsausf&uuml;hrung?</span> <div class="answer"> <ul> <li>Holphase</li> <li>Dekodierphase</li> <li>Ausf&uuml;hrungsphase</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Warum gibt es mehr als ein Befehlsregister?</span> <div class="answer"> <ul> <li>Die Befehlsformate sind unterschiedlich lang</li> <li>Opcode-Prefetching</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Was ist der Unterschied zwischen BCD in gepackter Darstellung und BCD in ungepackter Darstellung?</span> <div class="answer"> Bei BCD in gepackter Darstellung werden in einem Byte (8 Bit) zwei BCD-Zahlen dargestellt. In der ungepackten Darstellung wird in einem Byte nur eine BCD-Zahl dargestellt. </div> <p></div></p> <div class="question"> <span class="question">Pipeline-Konflikte: Welche Forwarding-Techniken gibt es und wie werden sie umgesetzt?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/forwarding-techniken2-300x249.png"><img src="../images/2013/01/forwarding-techniken2-300x249.png" alt="" width="300" height="249" class="size-medium wp-image-62451"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Welche Halbleiterspeichertypen gibt es?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/halbleiterspeicher-klassifizierung-300x77.png"><img src="../images/2013/01/halbleiterspeicher-klassifizierung-300x77.png" alt="" width="300" height="77" class="size-medium wp-image-62511"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Skizzieren Sie eine SRAM-Zelle.</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/cmos-sram-cell-300x300.png"><img src="../images/2013/01/cmos-sram-cell-300x300.png" alt="" width="300" height="300" class="size-medium wp-image-62521"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie unterscheiden sich RISC- und CISC-Architekturen?</span> <div class="answer"> <table> <thead> <tr> <th>CISC</th> <th>RISC</th> </tr> </thead> <tbody> <tr> <td>Komplexe Befehle, die in mehreren Taktzyklen ausgef&uuml;hrt werden</td> <td>Einfache Befehle, die in einem Taktzyklus ausgef&uuml;hrt werden</td> </tr> <tr> <td>Jeder Befehl kann auf den Speicher zugreifen</td> <td>Nur Lade- und Speicherbefehle greifen auf den Speicher zu</td> </tr> <tr> <td>Wenig Pipelining</td> <td>Intensives Pipelining</td> </tr> <tr> <td>Befehle werden von einem Mikroprogramm interpretiert</td> <td>Befehle werden durch festverdrahtete Hardware ausgef&uuml;hrt</td> </tr> <tr> <td>Befehlsformat variabler L&auml;nge</td> <td>Befehlsformat fester L&auml;nge</td> </tr> <tr> <td>Die Komplexit&auml;t liegt im Mikroprogramm</td> <td>Die Komplexit&auml;t liegt im Compiler</td> </tr> <tr> <td>Einfacher Registersatz</td> <td>Mehrere Registers&auml;tze</td> </tr> </tbody> </table> </div> <p></div></p> <div class="question"> <span class="question">Wie sieht das Schaltsymbol eines Halbaddierers aus?</span> <div class="answer"> <div style="width: 288px" class="wp-caption aligncenter"><a href="../images/2013/01/addierer-schaltsymbol.png"><img src="../images/2013/01/addierer-schaltsymbol.png" alt="" width="288" height="184" class="size-full wp-image-62671"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <div class="question"> <span class="question">Wie kann man die Datenabh&auml;ngigkeiten einer Pipeline spezifizieren und erkennen?</span> <div class="answer"> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/ti-pipeline-datenabhaengigkeit-300x121.jpg"><img src="../images/2013/01/ti-pipeline-datenabhaengigkeit-300x121.jpg" alt="" width="300" height="121" class="size-medium wp-image-62791"/></a><p class="wp-caption-text"></p></div> Erkennen kann man sie sehr schnell, indem man eine Tabelle mit den Spalten Befehl, Ziel-Register und Operanden-Register macht. Dabei muss man insbesondere bei der Multiplikation, <code>sw</code> und <code>lw</code> aufpassen. Folgendes (sehr gekrizeltes) Beispiel f&uuml;r die <a href="http://ti.ira.uka.de/Klausur/AlteKlausuren/k_ss_12.pdf#page=11">Klausur vom 26. Juli 2012</a>: <div style="width: 512px" class="wp-caption alignnone"><a href="../images/2013/01/datenabhaengigkeiten-erkennen.jpg"><img src="../images/2013/01/datenabhaengigkeiten-erkennen.jpg" alt="" width="512" height="249" class="size-full wp-image-63101"/></a><p class="wp-caption-text"></p></div> </div> <p></div></p> <h2>Material</h2> <ul> <li><a href="http://ti.ira.uka.de/">TI-Website</a> <ul> <li><a href="http://ti.ira.uka.de/Klausur/AlteKlausuren/AlteKlausuren.php">alte Klausuren</a></li> <li><a href="http://ti.ira.uka.de/Adressierungsarten/">Flash-Animation zur Adressierung</a></li> </ul> </li> <li><a href="https://ankiweb.net/shared/info/144985236">Meine Karteikarten</a> (Siehe Anki auf <a href="http://de.wikipedia.org/wiki/Anki">Wikipedia</a> und <a href="http://wiki.ubuntuusers.de/Anki">UbuntuUsers</a> f&uuml;r mehr Informationen)</li> <li><a href="http://www.titut.de/">titut.de</a>, <a href="http://tutorium.chrismandery.de/">tutorium.chrismandery.de</a></li> </ul> <p>StackOverflow: <ul> <li><a href="http://stackoverflow.com/q/4115847/562769">Strange jump in MIPS assembly</a></li> </ul></p> <h2>Aufbau der Klausur</h2> <p>Die Klausuren sind alle sehr &auml;hnlich aufgebaut. Eine typische Klausur hat 10 Aufgaben zu diesen Themen:</p> <ol> <li><strong>Schaltfunktionen</strong></li> <li><strong>Spezielle Bausteine</strong></li> <li><strong>Laufzeiteffekte</strong></li> <li><strong>Schaltwerke</strong></li> <li><strong>Rechnerarithmetik und Codes</strong></li> <li><strong>Allgemeines</strong>: Ankreuzaufgaben</li> <li><strong>MIPS-Assembler</strong>: C-Code in MIPS umwandeln und umgekehrt</li> <li><strong>Pipelining</strong>: Datenkonflikte erkennen und mit NOPs beheben, eventuell gibts noch Forwarding</li> <li><strong>Cache-Speicher</strong></li> <li><strong>Speicher</strong></li> </ol> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Mittwoch, den 3. April 2013 von 14:00 bis 16:00 Uhr <strong>Ort</strong>: <a href="http://kit.carstengriesheimer.de/map/1458">Gaede</a> (bei mir; siehe <a href="http://ti.ira.uka.de/Klausur/Hoersaalverteilung.htm">H&ouml;rsaaleinteilung</a>, die seit dem 2. April 2013 drau&szlig;en ist) <strong>Dauer</strong>: 1 h DT, 1 h RO <strong>Punkte</strong>: (vermutlich) 90 <strong>Bestehensgrenze</strong>: (vermutlich) 40 <strong>&Uuml;bungsschein</strong>: Wird nicht ins Studienportal eingetragen <strong>Bonuspunkte</strong>: <ul> <li>&Uuml;bungsschein RO: 1 Bonuspunkt</li> <li>&Uuml;bungsschein DT: 1 Bonuspunkt</li> <li>F&uuml;r die Probeklausuren jeweils: <ul> <li>Note &bdquo;Sehr gut&ldquo;: 2 Bonuspunkte</li> <li>Note &bdquo;Gut&ldquo;: 1,5 Bonuspunkte</li> <li>Note &bdquo;Befriedigend&ldquo;: 1 Bonuspunkt</li> <li>Note &bdquo;Ausreichend&ldquo;: 0,5 Bonuspunkte</li> </ul> </li> </ul></p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Ergebnisse</h2> <p>Die Klausureinsicht ist am Montag, den 29. April 2013. F&uuml;r die Einsicht muss man sich <a href="http://ti.ira.uka.de/Klausur/Einsicht/">hier</a> anmelden.</p> Software Licenses http://martin-thoma.com/software-licenses Sat, 26 Jan 2013 08:59:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/software-licenses <p>Do you know the difference between MIT-license and BSD license? I don&#39;t. And I don&#39;t want to read the <a href="http://en.wikipedia.org/wiki/MIT_License">MIT license</a>, although it is very short. And I definitely don&#39;t want to read the <a href="http://directory.fsf.org/wiki/License:Apache2.0">Apache 2.0 license</a>.</p> <p>Instead of reading all licenses, you could first read <a href="http://www.smashingmagazine.com/2010/03/24/a-short-guide-to-open-source-and-similar-licenses/">A Short Guide To Open-Source And Similar Licenses</a>.</p> <p>Even shorter: <a href="http://www.tldrlegal.com/">TL;DR - Open Source Licenses Explained in Plain English</a>. <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/TLDRLegal-300x158.png"><img src="../images/2013/01/TLDRLegal-300x158.png" alt="" width="300" height="158" class="size-medium wp-image-55141"/></a><p class="wp-caption-text"></p></div></p> <p>Licenses are important for OpenSource, because if you don&#39;t provide a license, nobody may use your source (<a href="http://stackoverflow.com/a/13669816/562769">source</a>). So even if everybody can see your code, it is not OpenSource if you don&#39;t choose an OpenSource license.</p> <p>I think Jeff Atwood has written an article about the fact, that many GitHub projects are not OpenSource due to a missing license. Sadly, I don&#39;t find the article. But here is another one by him: <a href="http://www.codinghorror.com/blog/2007/04/pick-a-license-any-license.html">Pick a License, Any License</a></p> Part II: The Strassen algorithm in Python, Java and C++ http://martin-thoma.com/strassen-algorithm-in-python-java-cpp Wed, 23 Jan 2013 09:35:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/strassen-algorithm-in-python-java-cpp <div class="info">This is Part II of my matrix multiplication series. <a href="../matrix-multiplication-python-java-cpp/">Part I</a> was about simple matrix multiplication algorithms and <a href="../strassen-algorithm-in-python-java-cpp/">Part II</a> was about the Strassen algorithm. <a href="../part-iii-matrix-multiplication-on-multiple-cores-in-python-java-and-c/">Part III</a> is about parallel matrix multiplication.</div> <p>The usual matrix multiplication of two <code>$n \times n$</code> matrices has a time-complexity of <code>$\mathcal{O}(n^3)$</code>. This means, if <code>$n$</code> doubles, the time for the computation increases by a factor of 8. But you don&#39;t have to use that much resources. The <a href="http://en.wikipedia.org/wiki/Strassen_algorithm">Strassen algorithm</a> has a time complexity of <code>$\mathcal O(n^{log_2(7)+o(1)}) \approx \cal O(n^{2.807})$</code>. The idea is similar to the <a href="http://en.wikipedia.org/wiki/Karatsuba_algorithm">Karatsuba algorithm</a> for simple multiplication. Basically, you make a tradeof: Instead of one multiplication, you use many additions. As additions are - at least for humans - easier, you might rather like to use many additions. Lets see how the Strassen algortihms execution time compares to the other execution times in Part I. As last time, I&#39;ll multiply two <code>$2000 \times 2000$</code> matrices that have to be read from a file. Everything - reading, calculation and writing the result - counts to the execution time.</p> <h2>The implementations</h2> <p>As last time, I&#39;ve added the scripts to a <a href="https://github.com/MartinThoma/matrix-multiplication">GIT repository</a>, so feel free to test it on your machine. I will use the I am also happy if you post some of your solutions with running times :-) If you know other languages, you could create a script for these. I focus on Python, Java and C++.</p> <p>I have implemented only the Strassen algorithm for this post. Please take a look at Wikipedia for a detailed explanation how this algorithm works. The important idea of the algorithm is that you break both matrices into four <code>$\frac{n}{2} \times \frac{n}{2}$</code> matrices and multiply them in a clever way. Note that you can also use the Strassen algorithm recursively for those <code>$\frac{n}{2} \times \frac{n}{2}$</code> matrices. You can do this until you have <code>$1 \times 1$</code> matrices which are simple numbers. But it does make sense to stop this recursion and use the <a href="../matrix-multiplication-python-java-cpp/#ikj-algorithm">ikj-algorithm</a> as soon as the matrices are small enough. But what exactly is &quot;small enough&quot;? I&#39;ll test that. The size when you use the ikj-algorithm is called <code>LEAF_SIZE</code> in my scripts. Note that only leaf sizes of multiples of two matter as the size of the (sub-)matrices that get passed to strassenR are multiples of two.</p> <p>If you post a solution, please consider these restrictions: <ul> <li><strong>Input</strong>: <ul> <li>The input file should get passed with the parameter <code>-i</code>, e.g.: <code>python -i bigMatrix.in</code> or <code>java Shell -i bigMatrix.in</code></li> <li>The leaf-size should get passed with <code>-l</code>, e.g.: <code>python -i bigMatrix.in -l 32</code></li> </ul> </li> <li>The standard value for the command line parameter -i should be &quot;bigMatrix.in&quot;</li> <li>The user should <em>not</em> have to give the size of the matrix!</li> <li>The two square-matrices that should get multiplied are ... <ul> <li>... read from a text-file.</li> <li>... represented like this: <ul> <li>Every line of one matrix is one line in the text-file.</li> <li>Newlines are only &quot;\n&quot;.</li> <li>Every number is separated by &quot;\t&quot;.</li> <li>The both matrices are separated by one newline.</li> </ul> </li> </ul> </li> <li><strong>Output</strong>: The result has to get printed to standard output.</li> <li>The result has to be formatted like the input (tabs for separation of number, \n for marks a new line)</li> </ul></p> <h2>Tests and Setting</h2> <p><a href="../matrix-multiplication-python-java-cpp/#The_Tests">Tests and setting</a> are the same as in the first part.</p> <h2>Python</h2> <p>I&rsquo;ve used Python 2.6.5.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span><span class="p">,</span> <span class="n">log</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="k">def</span> <span class="nf">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">subtract</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">strassenR</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; </span> <span class="sd"> Implementation of the strassen algorithm.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="n">LEAF_SIZE</span><span class="p">:</span> <span class="k">return</span> <span class="n">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c"># initializing the new sub-matrices</span> <span class="n">newSize</span> <span class="o">=</span> <span class="n">n</span><span class="o">/</span><span class="mi">2</span> <span class="n">a11</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">a12</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">a21</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">a22</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">b11</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">b12</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">b21</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">b22</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">aResult</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="n">bResult</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">)]</span> <span class="c"># dividing the matrices in 4 sub-matrices:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">):</span> <span class="n">a11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># top left</span> <span class="n">a12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="c"># top right</span> <span class="n">a21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># bottom left</span> <span class="n">a22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="c"># bottom right</span> <span class="n">b11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># top left</span> <span class="n">b12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="c"># top right</span> <span class="n">b21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="c"># bottom left</span> <span class="n">b22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="c"># bottom right</span> <span class="c"># Calculating p1 to p7:</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">a22</span><span class="p">)</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">b11</span><span class="p">,</span> <span class="n">b22</span><span class="p">)</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">)</span> <span class="c"># p1 = (a11+a22) * (b11+b22)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">a21</span><span class="p">,</span> <span class="n">a22</span><span class="p">)</span> <span class="c"># a21 + a22</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">b11</span><span class="p">)</span> <span class="c"># p2 = (a21+a22) * (b11)</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">b12</span><span class="p">,</span> <span class="n">b22</span><span class="p">)</span> <span class="c"># b12 - b22</span> <span class="n">p3</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">bResult</span><span class="p">)</span> <span class="c"># p3 = (a11) * (b12 - b22)</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">b21</span><span class="p">,</span> <span class="n">b11</span><span class="p">)</span> <span class="c"># b21 - b11</span> <span class="n">p4</span> <span class="o">=</span><span class="n">strassenR</span><span class="p">(</span><span class="n">a22</span><span class="p">,</span> <span class="n">bResult</span><span class="p">)</span> <span class="c"># p4 = (a22) * (b21 - b11)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">a12</span><span class="p">)</span> <span class="c"># a11 + a12</span> <span class="n">p5</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">b22</span><span class="p">)</span> <span class="c"># p5 = (a11+a12) * (b22) </span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">a21</span><span class="p">,</span> <span class="n">a11</span><span class="p">)</span> <span class="c"># a21 - a11</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">b11</span><span class="p">,</span> <span class="n">b12</span><span class="p">)</span> <span class="c"># b11 + b12</span> <span class="n">p6</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">)</span> <span class="c"># p6 = (a21-a11) * (b11+b12)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">a12</span><span class="p">,</span> <span class="n">a22</span><span class="p">)</span> <span class="c"># a12 - a22</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">b21</span><span class="p">,</span> <span class="n">b22</span><span class="p">)</span> <span class="c"># b21 + b22</span> <span class="n">p7</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">)</span> <span class="c"># p7 = (a12-a22) * (b21+b22)</span> <span class="c"># calculating c21, c21, c11 e c22:</span> <span class="n">c12</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">p3</span><span class="p">,</span> <span class="n">p5</span><span class="p">)</span> <span class="c"># c12 = p3 + p5</span> <span class="n">c21</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">p4</span><span class="p">)</span> <span class="c"># c21 = p2 + p4</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p4</span><span class="p">)</span> <span class="c"># p1 + p4</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span> <span class="c"># p1 + p4 + p7</span> <span class="n">c11</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">bResult</span><span class="p">,</span> <span class="n">p5</span><span class="p">)</span> <span class="c"># c11 = p1 + p4 - p5 + p7</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p3</span><span class="p">)</span> <span class="c"># p1 + p3</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">p6</span><span class="p">)</span> <span class="c"># p1 + p3 + p6</span> <span class="n">c22</span> <span class="o">=</span> <span class="n">subtract</span><span class="p">(</span><span class="n">bResult</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span> <span class="c"># c22 = p1 + p3 - p2 + p6</span> <span class="c"># Grouping the results obtained in a single matrix:</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">newSize</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">c11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="o">=</span> <span class="n">c12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">c21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="p">]</span> <span class="o">=</span> <span class="n">c22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="k">def</span> <span class="nf">strassen</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="k">assert</span> <span class="nb">type</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">B</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="c"># Make the matrices bigger so that you can apply the strassen</span> <span class="c"># algorithm recursively without having to deal with odd</span> <span class="c"># matrix sizes</span> <span class="n">nextPowerOfTwo</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="mi">2</span><span class="o">**</span><span class="nb">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">log</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="mi">2</span><span class="p">)))</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">m</span> <span class="o">=</span> <span class="n">nextPowerOfTwo</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">APrep</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m</span><span class="p">)]</span> <span class="n">BPrep</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">APrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="n">BPrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="n">CPrep</span> <span class="o">=</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">APrep</span><span class="p">,</span> <span class="n">BPrep</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">CPrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;2000.in&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-l&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;LEAF_SIZE&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;8&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;when do you start using ikj&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;LEAF_SIZE&quot;</span><span class="p">)</span> <span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="n">LEAF_SIZE</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">LEAF_SIZE</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">strassen</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> </code></pre></div> <p>The execution-times were the same as with the ikj-algorithm, no matter what the leaf size was:</p> <div class="highlight"><pre><code class="bash">ikj-algorithm 44m13.458s LEAF_SIZE Time 2 47m45.983s 8 47m41.311s 16 48m5.472s 32 48m5.624s 64 47m55.076s </code></pre></div> <h2>Java</h2> <p>The Java-code is a little bit long and has three classes. I&#39;ll only past the important methods. If you&#39;re interested in a full, working example, please look at <a href="https://github.com/MartinThoma/matrix-multiplication/tree/master/Java">GitHub</a>.</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">ikjAlgorithm</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">A</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="c1">// initialise C</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">k</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">k</span><span class="o">]</span> <span class="o">*</span> <span class="n">B</span><span class="o">[</span><span class="n">k</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">add</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">A</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">subtract</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">A</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">-</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span> <span class="nf">nextPowerOfTwo</span><span class="o">(</span><span class="kt">int</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">log2</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="n">Math</span><span class="o">.</span><span class="na">ceil</span><span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">log</span><span class="o">(</span><span class="n">n</span><span class="o">)</span> <span class="o">/</span> <span class="n">Math</span><span class="o">.</span><span class="na">log</span><span class="o">(</span><span class="mi">2</span><span class="o">));</span> <span class="k">return</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="n">Math</span><span class="o">.</span><span class="na">pow</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="n">log2</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">strassen</span><span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Make the matrices bigger so that you can apply the strassen</span> <span class="c1">// algorithm recursively without having to deal with odd</span> <span class="c1">// matrix sizes</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">nextPowerOfTwo</span><span class="o">(</span><span class="n">n</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">APrep</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">m</span><span class="o">][</span><span class="n">m</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">BPrep</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">m</span><span class="o">][</span><span class="n">m</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">APrep</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="n">BPrep</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">CPrep</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">APrep</span><span class="o">,</span> <span class="n">BPrep</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">CPrep</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">strassenR</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">A</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">n</span> <span class="o">&lt;=</span> <span class="n">LEAF_SIZE</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">ikjAlgorithm</span><span class="o">(</span><span class="n">A</span><span class="o">,</span> <span class="n">B</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="c1">// initializing the new sub-matrices</span> <span class="kt">int</span> <span class="n">newSize</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="mi">2</span><span class="o">;</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">a11</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">a12</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">a21</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">a22</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">b11</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">b12</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">b21</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">b22</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">aResult</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">bResult</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">newSize</span><span class="o">][</span><span class="n">newSize</span><span class="o">];</span> <span class="c1">// dividing the matrices in 4 sub-matrices:</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">newSize</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">newSize</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">a11</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="c1">// top left</span> <span class="n">a12</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">];</span> <span class="c1">// top right</span> <span class="n">a21</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="c1">// bottom left</span> <span class="n">a22</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">];</span> <span class="c1">// bottom right</span> <span class="n">b11</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="c1">// top left</span> <span class="n">b12</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">];</span> <span class="c1">// top right</span> <span class="n">b21</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="c1">// bottom left</span> <span class="n">b22</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">];</span> <span class="c1">// bottom right</span> <span class="o">}</span> <span class="o">}</span> <span class="c1">// Calculating p1 to p7:</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">a11</span><span class="o">,</span> <span class="n">a22</span><span class="o">);</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">b11</span><span class="o">,</span> <span class="n">b22</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">bResult</span><span class="o">);</span> <span class="c1">// p1 = (a11+a22) * (b11+b22)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">a21</span><span class="o">,</span> <span class="n">a22</span><span class="o">);</span> <span class="c1">// a21 + a22</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">b11</span><span class="o">);</span> <span class="c1">// p2 = (a21+a22) * (b11)</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">b12</span><span class="o">,</span> <span class="n">b22</span><span class="o">);</span> <span class="c1">// b12 - b22</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p3</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">a11</span><span class="o">,</span> <span class="n">bResult</span><span class="o">);</span> <span class="c1">// p3 = (a11) * (b12 - b22)</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">b21</span><span class="o">,</span> <span class="n">b11</span><span class="o">);</span> <span class="c1">// b21 - b11</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p4</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">a22</span><span class="o">,</span> <span class="n">bResult</span><span class="o">);</span> <span class="c1">// p4 = (a22) * (b21 - b11)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">a11</span><span class="o">,</span> <span class="n">a12</span><span class="o">);</span> <span class="c1">// a11 + a12</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p5</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">b22</span><span class="o">);</span> <span class="c1">// p5 = (a11+a12) * (b22)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">a21</span><span class="o">,</span> <span class="n">a11</span><span class="o">);</span> <span class="c1">// a21 - a11</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">b11</span><span class="o">,</span> <span class="n">b12</span><span class="o">);</span> <span class="c1">// b11 + b12</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p6</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">bResult</span><span class="o">);</span> <span class="c1">// p6 = (a21-a11) * (b11+b12)</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">a12</span><span class="o">,</span> <span class="n">a22</span><span class="o">);</span> <span class="c1">// a12 - a22</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">b21</span><span class="o">,</span> <span class="n">b22</span><span class="o">);</span> <span class="c1">// b21 + b22</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">p7</span> <span class="o">=</span> <span class="n">strassenR</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">bResult</span><span class="o">);</span> <span class="c1">// p7 = (a12-a22) * (b21+b22)</span> <span class="c1">// calculating c21, c21, c11 e c22:</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">c12</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">p3</span><span class="o">,</span> <span class="n">p5</span><span class="o">);</span> <span class="c1">// c12 = p3 + p5</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">c21</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">p2</span><span class="o">,</span> <span class="n">p4</span><span class="o">);</span> <span class="c1">// c21 = p2 + p4</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">p1</span><span class="o">,</span> <span class="n">p4</span><span class="o">);</span> <span class="c1">// p1 + p4</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">p7</span><span class="o">);</span> <span class="c1">// p1 + p4 + p7</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">c11</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">bResult</span><span class="o">,</span> <span class="n">p5</span><span class="o">);</span> <span class="c1">// c11 = p1 + p4 - p5 + p7</span> <span class="n">aResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">p1</span><span class="o">,</span> <span class="n">p3</span><span class="o">);</span> <span class="c1">// p1 + p3</span> <span class="n">bResult</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">aResult</span><span class="o">,</span> <span class="n">p6</span><span class="o">);</span> <span class="c1">// p1 + p3 + p6</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">c22</span> <span class="o">=</span> <span class="n">subtract</span><span class="o">(</span><span class="n">bResult</span><span class="o">,</span> <span class="n">p2</span><span class="o">);</span> <span class="c1">// c22 = p1 + p3 - p2 + p6</span> <span class="c1">// Grouping the results obtained in a single matrix:</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">newSize</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">newSize</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">c11</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">]</span> <span class="o">=</span> <span class="n">c12</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">c21</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newSize</span><span class="o">]</span> <span class="o">=</span> <span class="n">c22</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">];</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Here are the results for different leaf-sizes: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/01/bchart-simple.png"><img src="../images/2013/01/bchart-simple.png" alt="" width="500" height="349" class="size-full wp-image-54901"/></a><p class="wp-caption-text"></p></div></p> <h2>C++</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;sstream&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;fstream&gt;</span> <span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;algorithm&gt;</span> <span class="cp">#include &lt;cmath&gt;</span> <span class="c1">// Set LEAF_SIZE to 1 if you want to the pure strassen algorithm</span> <span class="c1">// otherwise, the ikj-algorithm will be applied when the split</span> <span class="c1">// matrices are as small as LEAF_SIZE x LEAF_SIZE</span> <span class="kt">int</span> <span class="n">leafsize</span><span class="p">;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="cm">/*</span> <span class="cm"> * Implementation of the strassen algorithm, similar to </span> <span class="cm"> * http://en.wikipedia.org/w/index.php?title=Strassen_algorithm&amp;amp;oldid=498910018#Source_code_of_the_Strassen_algorithm_in_C_language</span> <span class="cm"> */</span> <span class="kt">void</span> <span class="n">strassen</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">);</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">nextPowerOfTwo</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">);</span> <span class="kt">void</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">);</span> <span class="kt">void</span> <span class="n">sum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">);</span> <span class="kt">void</span> <span class="n">subtract</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">matrix</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">);</span> <span class="kt">void</span> <span class="n">read</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">);</span> <span class="kt">void</span> <span class="n">ikjalgorithm</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">tam</span> <span class="o">&lt;=</span> <span class="n">leafsize</span><span class="p">)</span> <span class="p">{</span> <span class="n">ikjalgorithm</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">tam</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// other cases are treated here:</span> <span class="k">else</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">newTam</span> <span class="o">=</span> <span class="n">tam</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">inner</span> <span class="p">(</span><span class="n">newTam</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">a11</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">a12</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">a21</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">a22</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">b11</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">b12</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">b21</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">b22</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">c11</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">c12</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">c21</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">c22</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p1</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p2</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p3</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p4</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p5</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p6</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">p7</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">aResult</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">),</span> <span class="n">bResult</span><span class="p">(</span><span class="n">newTam</span><span class="p">,</span><span class="n">inner</span><span class="p">);</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span> <span class="c1">//dividing the matrices in 4 sub-matrices:</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">newTam</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">newTam</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">a11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">a12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">];</span> <span class="n">a21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">a22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">];</span> <span class="n">b11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">b12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">];</span> <span class="n">b21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">b22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// Calculating p1 to p7:</span> <span class="n">sum</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">a22</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// a11 + a22</span> <span class="n">sum</span><span class="p">(</span><span class="n">b11</span><span class="p">,</span> <span class="n">b22</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// b11 + b22</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p1 = (a11+a22) * (b11+b22)</span> <span class="n">sum</span><span class="p">(</span><span class="n">a21</span><span class="p">,</span> <span class="n">a22</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// a21 + a22</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">b11</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p2 = (a21+a22) * (b11)</span> <span class="n">subtract</span><span class="p">(</span><span class="n">b12</span><span class="p">,</span> <span class="n">b22</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// b12 - b22</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">p3</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p3 = (a11) * (b12 - b22)</span> <span class="n">subtract</span><span class="p">(</span><span class="n">b21</span><span class="p">,</span> <span class="n">b11</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// b21 - b11</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">a22</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">p4</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p4 = (a22) * (b21 - b11)</span> <span class="n">sum</span><span class="p">(</span><span class="n">a11</span><span class="p">,</span> <span class="n">a12</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// a11 + a12</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">b22</span><span class="p">,</span> <span class="n">p5</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p5 = (a11+a12) * (b22) </span> <span class="n">subtract</span><span class="p">(</span><span class="n">a21</span><span class="p">,</span> <span class="n">a11</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// a21 - a11</span> <span class="n">sum</span><span class="p">(</span><span class="n">b11</span><span class="p">,</span> <span class="n">b12</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// b11 + b12</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">p6</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p6 = (a21-a11) * (b11+b12)</span> <span class="n">subtract</span><span class="p">(</span><span class="n">a12</span><span class="p">,</span> <span class="n">a22</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// a12 - a22</span> <span class="n">sum</span><span class="p">(</span><span class="n">b21</span><span class="p">,</span> <span class="n">b22</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// b21 + b22</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">p7</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p7 = (a12-a22) * (b21+b22)</span> <span class="c1">// calculating c21, c21, c11 e c22:</span> <span class="n">sum</span><span class="p">(</span><span class="n">p3</span><span class="p">,</span> <span class="n">p5</span><span class="p">,</span> <span class="n">c12</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// c12 = p3 + p5</span> <span class="n">sum</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">p4</span><span class="p">,</span> <span class="n">c21</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// c21 = p2 + p4</span> <span class="n">sum</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p4</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p1 + p4</span> <span class="n">sum</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">p7</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p1 + p4 + p7</span> <span class="n">subtract</span><span class="p">(</span><span class="n">bResult</span><span class="p">,</span> <span class="n">p5</span><span class="p">,</span> <span class="n">c11</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// c11 = p1 + p4 - p5 + p7</span> <span class="n">sum</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p3</span><span class="p">,</span> <span class="n">aResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p1 + p3</span> <span class="n">sum</span><span class="p">(</span><span class="n">aResult</span><span class="p">,</span> <span class="n">p6</span><span class="p">,</span> <span class="n">bResult</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// p1 + p3 + p6</span> <span class="n">subtract</span><span class="p">(</span><span class="n">bResult</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">c22</span><span class="p">,</span> <span class="n">newTam</span><span class="p">);</span> <span class="c1">// c22 = p1 + p3 - p2 + p6</span> <span class="c1">// Grouping the results obtained in a single matrix:</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">newTam</span> <span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">newTam</span> <span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">c11</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">]</span> <span class="o">=</span> <span class="n">c12</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">c21</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="n">newTam</span><span class="p">]</span> <span class="o">=</span> <span class="n">c22</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">nextPowerOfTwo</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="kt">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">log2</span><span class="p">(</span><span class="n">n</span><span class="p">))));</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">strassen</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//unsigned int n = tam;</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">nextPowerOfTwo</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">inner</span><span class="p">(</span><span class="n">m</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">APrep</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">inner</span><span class="p">),</span> <span class="n">BPrep</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">inner</span><span class="p">),</span> <span class="n">CPrep</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">inner</span><span class="p">);</span> <span class="k">for</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">APrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="n">BPrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="n">strassenR</span><span class="p">(</span><span class="n">APrep</span><span class="p">,</span> <span class="n">BPrep</span><span class="p">,</span> <span class="n">CPrep</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span> <span class="k">for</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">CPrep</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">sum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">tam</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">tam</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">subtract</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">C</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tam</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">tam</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">tam</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">getMatrixSize</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">ifstream</span> <span class="n">infile</span><span class="p">;</span> <span class="n">infile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span> <span class="k">return</span> <span class="n">count</span><span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">line</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="sc">&#39;\t&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">read</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">B</span><span class="p">)</span> <span class="p">{</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">matrixfile</span> <span class="o">=</span> <span class="n">freopen</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="s">&quot;r&quot;</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">matrixfile</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Could not read file &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">filename</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">a</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">line</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">fclose</span> <span class="p">(</span><span class="n">matrixfile</span><span class="p">);</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">matrix</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">matrix</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">string</span> <span class="n">filename</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;2000.in&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span> <span class="n">leafsize</span> <span class="o">=</span> <span class="mi">16</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">leafsize</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">4</span><span class="p">]);</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">getMatrixSize</span><span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">inner</span> <span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">inner</span><span class="p">),</span> <span class="n">B</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">inner</span><span class="p">),</span> <span class="n">C</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">inner</span><span class="p">);</span> <span class="n">read</span> <span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">);</span> <span class="n">strassen</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>For C++, you get those user-times for the different leaf-sizes: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2013/01/cpp-leaf-size-times.png"><img src="../images/2013/01/cpp-leaf-size-times.png" alt="" width="500" height="333" class="size-full wp-image-54921"/></a><p class="wp-caption-text"></p></div></p> <h2>Conclusion</h2> <p>As always, C++ is the fastest solution. </p> <p>I am a little bit surprised, that the LEAF<em>SIZE doesn&#39;t matter for Python. I think I have used some very slow operations that are much more important than any speed gains or losses due to LEAF</em>SIZE. I guess the list creation might be slow. Does anybody know a tool for performance analysis of Python programs? This tool should be able to track which pieces of code got executed most often any preferably visualize it.</p> <p>For Java and C++, the Strassen algorithm had better execution times than the ikj-algorithm and it was also better than any library that I could find. The reasons why librarys perform worse than my implementation might be that pure integer matrices are rather rare. Usually you have double-matrices. Maybe you use different algorithms to keep rounding errors as small as possible (Can anybody provide more information to my speculations?)</p> <p>Leafsizes from 64 to 256 seem to be the best solution.</p> Check x-in-a-row for board games http://martin-thoma.com/check-x-in-a-row-for-board-games Mon, 21 Jan 2013 20:59:28 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/check-x-in-a-row-for-board-games <p>In board games, you have quite often the situation that you want to check something in different directions. Most of the time, the implementation I see for situations like this is very redundant and prone to off-by-one errors. Some simple ideas can improve the quality of codes (code that is easier to understand and less <abbr title="lines of code">loc</abbr>) and reduce the probability of tiny mistakes.</p> <p>[gallery ids=&quot;54621,54611,54601&quot;]</p> <h2>isOnBoard(int x, int y)</h2> <p>You should create a method that checks if a coordinate is on your board. This can be as simple as this:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isOnBoard</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">width</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">y</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">height</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <h2>Diagonal, horizontal and vertical</h2> <p>You can create a method like this:</p> <div class="highlight"><pre><code class="java"><span class="cm">/**</span> <span class="cm"> * This method checks XYZ and does XYZ.</span> <span class="cm"> * </span> <span class="cm"> * @param player the current player</span> <span class="cm"> * @param xDir -1 if you want to go to the left, 0 if you don&#39;t want </span> <span class="cm"> * to move in x-direction and 1 if you want to go to </span> <span class="cm"> * the right</span> <span class="cm"> * @param yDir -1 if you want to go to the bottom, 0 if you don&#39;t </span> <span class="cm"> * want to move in y-direction and 1 if you want to go </span> <span class="cm"> * to the top</span> <span class="cm"> */</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">myBoardAction</span><span class="o">(</span><span class="n">Player</span> <span class="n">player</span><span class="o">,</span> <span class="kt">int</span> <span class="n">xDir</span><span class="o">,</span> <span class="kt">int</span> <span class="n">yDir</span><span class="o">)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">board</span><span class="o">.</span><span class="na">width</span><span class="o">;</span> <span class="n">x</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">board</span><span class="o">.</span><span class="na">height</span><span class="o">;</span> <span class="n">y</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">c</span> <span class="o">&lt;</span> <span class="n">SOME_CONSTANT</span><span class="o">;</span> <span class="n">c</span><span class="o">++)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">board</span><span class="o">.</span><span class="na">isOnBoard</span><span class="o">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">c</span> <span class="o">*</span> <span class="n">xDir</span><span class="o">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">c</span> <span class="o">*</span> <span class="n">yDir</span><span class="o">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">board</span><span class="o">.</span><span class="na">checkXYZ</span><span class="o">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">c</span> <span class="o">*</span> <span class="n">xDir</span><span class="o">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">c</span> <span class="o">*</span> <span class="n">yDir</span><span class="o">))</span> <span class="o">{</span> <span class="n">doXYZ</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>What&#39;s so special about it? Well, note how the <code>xDir</code> and <code>yDir</code> parameters change the behavior of the method. If you want to move only to the right, you will call <code>myBoardAction(player, 1, 0)</code>. If you want to go to the top left, you will call <code>myBoardAction(player, -1, 1)</code>. Of course, you can&#39;t simply take this piece of code and only change doXYZ() and checkXYZ. You will have to change the starting and and position and maybe add a break. But this thought can be applied to board games quite nice.</p> <p>Please also note that I go from <code>(0|0)</code> to <code>(board.width|board.height)</code> and even add in the inner loop something. So some calls will be out of bound. But because of <a href="http://en.wikipedia.org/wiki/Short-circuit_evaluation">short-circuit evaluation</a> this works. I don&#39;t bother about ends, I simply include the critical parts. Most of the time, it is not much work to check if the call is within the boundary, but finding (and fixing) a bug is much work. Yes, I know, this is more efficient if you use the correct boundaries. But it&#39;s only a constant in time difference. And I guess this constant is very small for most games.</p> <p>Ah, and if you want to check a condition for all diagonals, horizontals and verticals the hole board, you can call it like this:</p> <div class="highlight"><pre><code class="java"><span class="n">myBoardAction</span><span class="o">(</span><span class="n">player</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span> <span class="c1">// top right</span> <span class="n">myBoardAction</span><span class="o">(</span><span class="n">player</span><span class="o">,-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span> <span class="c1">// top left</span> <span class="n">myBoardAction</span><span class="o">(</span><span class="n">player</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span> <span class="c1">// vertical</span> <span class="n">myBoardAction</span><span class="o">(</span><span class="n">player</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span> <span class="c1">// horizontal</span> </code></pre></div> <p>This is enough. You don&#39;t need more, as you go through the whole board. No need to write redundant code :-)</p> Cyclic references kill Nautilus http://martin-thoma.com/cyclic-references-kill-nautilus Sun, 20 Jan 2013 20:46:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/cyclic-references-kill-nautilus <p>I just wanted to answer an assignment and noticed that cyclic references kill Nautilus.</p> <h2>What I did</h2> <div class="highlight"><pre><code class="bash">mkdir testFolder <span class="nb">cd </span>testFolder touch testFile.txt ln -s testFile.txt mySoftlink rm testFile.txt ln -s mySoftlink testFile.txt ls -l total 0 lrwxrwxrwx 1 moose moose 10 2013-01-20 21:20 myfile.txt -&gt; mySoftLink lrwxrwxrwx 1 moose moose 10 2013-01-20 21:18 mySoftLink -&gt; myfile.txt </code></pre></div> <p>Those two softlinks refer to each other. Now try to open this folder with Nautilus:</p> <div class="highlight"><pre><code class="bash">nautilus /home/moose/Desktop/testFolder/ </code></pre></div> <p>Nautilus opens and instantly closes again.</p> <h2>My Nautilus</h2> <p>I use Ubuntu 10.04.4 LTS with Nautilus 2.30.1. </p> <h2>Bug report?</h2> <p>I know, the current version of <a href="http://en.wikipedia.org/wiki/Nautilus_(file_manager)">Nautilus</a> is 3.6.1, but how often do you find a bug which is so easy to reproduce?</p> <p>The Nautilus Bugtracker is <a href="https://bugzilla.gnome.org/browse.cgi?product=nautilus">here</a>, but where would you look for the bug?</p> Wie wende ich die Shannon-Zerlegung an? http://martin-thoma.com/wie-wende-ich-die-shannon-zerlegung-an Thu, 17 Jan 2013 16:46:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-wende-ich-die-shannon-zerlegung-an <p>Die Shannon-Zerlegung ist hilfreich, um die disjunktive bzw. konjunktive Form einer Funktion zu erhalten. Im Folgenden gibt es ein paar Beispiele, wie man das macht:</p> <h2>Vorgehen</h2> <ol> <li>Man hat eine boolsche Funktion `$f(x_1, x_2, \dots, x_n)$` gegeben.</li> <li>Entwickeln nach einer Variablen `$x_i$`: <ol> <li>`$g(x_1, \dots, x_n) := f(x_1, \dots, x_i=1, \dots, x_n)$`</li> <li>`$h(x_1, \dots, x_n) := f(x_1, \dots, x_i=0, \dots, x_n)$`</li> <li>`$f(x_1, x_2, \dots, x_n) = x_i [ g(x_1, \dots, x_n)] \lor \bar x_i [h(x_1, \dots, x_n)]$`</li> </ol> </li> <li>Vereinfachen der Funktion</li> </ol> <h2>Beispiel 1</h2> <p><code>$\begin{align} f(c, b, a) :&amp;= (c \land b) \barwedge a) \Leftrightarrow (b \lor a)\\ \text{Entwickeln nach c:} &amp;= c[((1 \land b) \barwedge a) \Leftrightarrow (b \lor a)] \lor \bar c [((0 \land b) \barwedge a) \Leftrightarrow (b \lor a)]\\ &amp;= c[(b \barwedge a) \Leftrightarrow (b \lor a)] \lor \bar c [(0 \barwedge a) \Leftrightarrow (b \lor a)]\\ &amp;= c[(b \barwedge a) \Leftrightarrow (b \lor a)] \lor \bar c [1 \Leftrightarrow (b \lor a)]\\ &amp;= c((b \barwedge a) \Leftrightarrow (b \lor a)) \lor \bar c (b \lor a)\\ \text{Entwickeln nach b:}&amp;= b \lor \bar b\\ &amp;= b \lor \bar b \\ &amp;= b(c \bar a \lor \bar c) \lor \bar b (ca \lor \bar c a)\\ \text{Entwickeln nach a:} &amp;= a[b(c \bar 1 \lor \bar c) \lor \bar b (c \lor \bar c)] \lor \bar a [b(c \bar 0 \lor \bar c) \lor \bar b (\bar c a)]\\ &amp;=a(b \bar c \lor \bar b) \lor \bar ab\\ &amp;= ab \bar c \lor a \bar b \lor \bar a b\\ &amp;= ab \bar c \lor a \bar b c \lor a \bar b \bar c \lor \bar a b c \lor \bar a b \bar c \end{align}$</code></p> <p>Die letzte Darstellung der Funktion <code>$f$</code> wird Disjunktive Normalform (DNF) genannt. Die vorletzte ist einfach nur eine disjunktion von Konjunktionen.</p> <h2>Beispiel 2</h2> <p><code>$\begin{align} f(c,b,a) &amp;:= ab \lor \bar c\\ \text{Entwickeln nach b:} &amp;= b[a \lor \bar c] \lor \bar b[\bar c]\\ &amp;= b(a \lor \bar c) \lor \bar b \bar c\\ \text{Entwickeln nach a:} &amp;= a[b \lor \bar b \bar c] \lor \bar a [b(\bar c) \lor \bar b \bar c]\\ &amp;= a(b \lor \bar b \bar c) \lor \bar a \bar c\\ &amp;= ab \lor a \bar b \bar c \lor \bar a \bar c\\ &amp;= (abc \lor ab \bar c) \lor a \bar b \bar c \lor (\bar a b \bar c \lor \bar a \bar b \bar c) \end{align}$</code> </p> <p>Man muss auch nicht immer Entwicklen, um das Ergebnis zu erhalten. Die Klammern im Ergebnis verdeutlichen, wie man den letzten Schritt durchf&uuml;hrt. Also wie man von einer Disjunktiven Form auf die Disjunktive Normalform kommt.</p> Adressierung http://martin-thoma.com/adressierung Fri, 11 Jan 2013 16:15:56 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/adressierung <div class="info">Dies ist eine Zusammenfassung von mir zu dem Themen Caches, Addressierung und TLB. Ich habe insbesondere bei dem letzem Teil (Cache-Typen und TLBs) das Gef&uuml;hl, dass ich das noch nicht richtig verstanden habe, deshalb ist der Inhalt hier mit Vorsicht zu genie&szlig;en. Bitte meldet mir Fehler oder Unstimmigkeiten (per Email an info@martin-thoma.de oder direkt als Kommentar).</div> <h2>Allgemeines</h2> <p>CPU-Caches sind aus Cache-Zeilen aufgebaut. Diese sind die kleinsten adressierbaren Einheiten im Cache. Die L&auml;nge der Cache-Zeilen variiert, aber 32-64 Byte sind &uuml;blich.<small><sup><a href="#ref1" name="anchor1">[1]</a></sup></small> Nun ist der Cache deutlich kleiner als der Hauptspeicher und man muss eine schnelle M&ouml;glichkeit haben, Hauptspeicher-Adressen auf den Cache abzubilden. </p> <p>Eine M&ouml;glichkeit das zu machen, ist ein sog. &bdquo;direct mapped cache&ldquo;. Das ist im Prinzip eine Hash-Funktion, die zus&auml;tlich noch schnell von der Hardware umgesetzt werden k&ouml;nnen muss. Also unterteilt man gedanklich die Hauptspeicheradressen in 3 Teile: <ul> <li>Tag</li> <li>Index</li> <li>Block-Offset</li> </ul></p> <p>Der Index gibt direkt die Cache-Zeile an, in der die Daten einer Hauptspeicheradresse landen werden. Es w&auml;re also z.B. m&ouml;glich, die Pins des Adressbus, auf denen die Index-Bits liegen, auf einen Multiplexer zu legen, der die entsprechende Cache-Zeile durchschaltet.</p> <p>Es gilt also: Index-L&auml;nge in Bit = <code>$\log_2(\text{Cache-Zeilen})$</code></p> <p>Nun kann es passieren, dass viele Hauptspeicher-Adressen in der selben Zeile landen. Um diese unterscheiden zu k&ouml;nnen, speichert man folgendes in einer Cache-Zeile: <ul> <li>Tag</li> <li>Datenblock</li> <li>Flags</li> </ul></p> <p>Der Datenblock beinhaltet die eigentlichen Daten aus dem Hauptspeicher. Ben&ouml;tigt nun ein Programm die Daten aus einer Hauptspeicheradresse, wird der Index dieser Adresse extrahiert und an dieser Cache-Zeile nachgeschaut. Wenn dann die Tags &uuml;bereinstimmen, ist es die richtige Adresse und man kann die Daten aus dem Cache entnehmen.</p> <p>Da man durch den Block-Offset ja eine ganze Reihe von Hauptspeicher-Adressen zusammenfasst, muss gelten:</p> <p>Gr&ouml;&szlig;e der Cache-Zeile <code>$= 2^{\text{L&amp;auml;nge des Block-offsets}} \cdot$</code> Gr&ouml;&szlig;e des Inhalts einer Hauptspeicheradresse</p> <p>Der Block-Offset wird nicht weiter verwendet. Es wird schlicht ignoriert.</p> <p>Der Tag muss aktiv im Cache gespeichert werden und die L&auml;nge des Tags im Cache muss mindestens so lang sein wie die Tag-L&auml;nge der Hauptspeicher-Adresse. Nat&uuml;rlich wird der Tag im Cache genau so lang sein wie der in der Hauptspeicher-Adresse. Man hat ja keinen Speicher zu verschenken.</p> <p>Bei einem Voll-Assoziativem Cache w&uuml;rde es also keinen Index geben. Eine Hauptspeicher-Adresse w&uuml;rde dann nur in Tag und Block-Offset geteilt werden.</p> <p>Bei einem <code>$n$</code>-fach Satzassoziativem Cache gibt es <code>$\frac{\text{Cachzeilen}}{n}$</code> S&auml;tze mit jeweils <code>$n$</code> Cachezeilen. Das Datenwort kann nur in einem Satz stehen, dort aber an einer beliebigen Stelle. Nun geht die CPU wie folgt vor:</p> <ol> <li>Datenwort mit Hauptspeicheradresse x = `$x_\text{tag}$` | `$x_\text{index}$` | `$x_\text{blockoffset}$` wird ben&ouml;tigt</li> <li>`$x_\text{index}$` = der zu durchsuchende Satz im Cache<br/> Dieser Satz wird zu den `$n$` Vergleichern durchgeschaltet</li> <li>Jeder Vergleicher vergleich den `$x_\text{tag}$` und den in der Cache-Zeile gespeicherten tag</li> <li>Wird die Adresse gefunden &rarr; Cache Hit<br/> Datenwort in keiner Cache-Zeile: Cache-Miss, Hauptspeicherzugriff</li> </ol> <h2>Physical address and virtual address</h2> <p>Die physische Adresse entspricht dem, womit man den Speicherbaustein anspricht. Nun kann es m&ouml;glich sein, dass man mehrere RAM-Bausteine hat oder dass das Programm theoretische mehr Speicher braucht als an Hauptspeicher zur verf&uuml;gung steht. Dennoch will man als Programmierer einheitlich adressieren. Also nutzt man im Userspace virtuelle Adressen (Im Kernel-Space k&ouml;nnen sowohl physische als auch virtuelle Adressen genutzt werden, siehe <a href="http://stackoverflow.com/a/6261020/562769">StackOverflow</a>). Au&szlig;erdem will man Speicherschutz herstellen. Die virtuellen Adressen sind scheinbar zusammenh&auml;ngend und der Adressraum ist sehr gro&szlig;. Der virtuelle Adressraum ist in Bl&ouml;cke (Pages) unterteilt und die Pages werden von langsamen, aber gro&szlig;en auf schnelle, aber kleine Speichermedien je nach Bedarf aus- oder eingelagert.</p> <p>Das passiert allerdings selten. Um zu sehen, wie h&auml;ufig das der Fall ist, sollte man sich folgendes anschauen: <ul> <li>/proc/swaps</li> <li>/proc/meminfo - ein paar <a href="http://www.centos.org/docs/5/html/5.2/Deployment_Guide/s2-proc-meminfo.html">Erkl&auml;rungen zu meminfo</a></li> <li><code>vmstat -s</code></li> </ul></p> <h2>Cache-Modelle</h2> <p>Fordert nun ein Prozess die Daten einer virtuellen Adresse an, kommt es nun auf die verschiedenen Cache-Modelle (PIPT, VIPT, VIVIT) an. Es gilt jedoch immer: Die CPU schaut im TLB nach, ob sie direkt erfahren kann, wo die Daten sind. Falls das nicht funktiniert, geht es wie folgt weiter:</p> <h3>Physically Indexed, Physically Tagged</h3> <p>Hier wird der index und der tag aus der physischen Adresse gezogen. Damit muss zuerst die MMU die virtuelle Adresse in eine physische Adresse umwandeln, bevor man im Cache nachschauen kann.</p> <h3>Virtually indexed, physically tagged</h3> <p>Man bekommt den Index aus der virtuellen Adresse, kann im Cache nachschauen ob dort &uuml;berhaupt etwas steht, falls ja muss aber noch die MMU die physische Adresse nachschlagen damit man den tag &uuml;berpr&uuml;fen kann.</p> <div class="frage">Frage: Wieso steht in den Folien "No ambiguities"? Annahme: Wir haben eine virtuelle Adresse 123456789. Der Index sind die Ziffern [4,6] also 456 Nun wird das auf die physische Adresse 123456789 gemappt. Der Tag sind die Ziffern [1,3] also 123 Nun haben wir eine zweite virtuelle Adresse 000456000. Der index sind die Ziffern [4,6] also 456 Die zugeh&ouml;rige phyische Adresse sein 123000000. Der Tag sind die Ziffern [1,3] also 123 Nun m&uuml;sste doch fehlerhaft ein Cache-Hit herauskommen, oder?</div> <h3>Physically Indexed / Virtually Tagged</h3> <p>Macht keinen Sinn, weil man Probleme wegen Doppeldeutigkeiten bekommen kann und man auf jeden Fall immer zuerst die MMU nutzen kann.</p> <h3>Virtually Indexed / Virtually Tagged</h3> <p>Kein MMU-Zugriff ben&ouml;tigt, also schneller als die anderen Varianten. Birgt aber ein paar Probleme (Ambiguity, Alias)</p> <h2>Quellen</h2> <ol> <li><a name="ref1" href="#anchor1">&uarr;</a>: <a href="http://alasir.com/articles/cache_principles/cache_line_tag_index.html">Functional Principles of Cache Memory</a></li> </ol> <ul> <li><a href="http://people.cs.umass.edu/~emery/classes/cmpsci377/current/notes/lecture_15_vm.pdf">Page-Table Lookups</a></li> <li><a href="http://de.wikipedia.org/wiki/Virtuelle_Adresse#Motivation">Virtuelle Adresse</a></li> <li><a href="http://en.wikipedia.org/wiki/CPU_cache">CPU cache</a></li> <li><a href="http://lwn.net/Articles/106177/">Four-level page tables</a></li> <li><a href="http://bottomupcs.sourceforge.net/csbu/x2816.htm">Linux Specifics: Address Space Layout</a></li> <li><a href="http://www.ecst.csuchico.edu/~hilzer/csci152/htm/EAT-TLB.htm">Some example assignments</a> (Memory access times, With and without TLBs)</li> </ul> How to sort with Java http://martin-thoma.com/how-to-sort-with-java Tue, 08 Jan 2013 20:49:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-sort-with-java <p>Sorting is a very basic task that every programmer should be able to solve. In Python, you have sort and sorted. In C++, you can use <a href="../cpp-operator-overloading/#Sorting">operator overloading</a>. I&#39;ll now tell you how to do basic sorting with Java. I will not write about <a href="http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html">natural language sorting</a> or language-aware sorting. This is only about simple sorting with Java.</p> <h2>Sorting without programming</h2> <p>First of all, you have to make sure that you understand how sorting works - without Java, just in the real world.</p> <p>What you need: <ul> <li>A container <code>$C$</code> of objects</li> <li>A way to compare two objects of the list at a time. The comparison, lets call it <code>$\leq$</code> needs to satisfy the following conditions: <ul> <li><a href="http://en.wikipedia.org/wiki/Total_relation">totality</a>: <code>$\forall x, y \in C: x \leq y \lor y \leq x$</code></li> <li><a href="http://en.wikipedia.org/wiki/Antisymmetric_relation">antisymmetry</a>: <code>$\forall x,y \in C: x \leq y \land y \leq x \Rightarrow x = y$</code></li> <li><a href="http://en.wikipedia.org/wiki/Transitive_relation">transitivity</a>: <code>$\forall x,y,z \in C: x \leq y \land y \leq z \Rightarrow x \leq z$</code></li> </ul> </li> </ul></p> <p>Just think about what you sort in your everyday life: <ul> <li>Numbers</li> <li>Words</li> <li><a href="http://en.wikipedia.org/wiki/List_of_countries_by_population">Contries by population</a></li> <li>Playing cards</li> </ul></p> <p>You can apply different algorithms like <a href="http://en.wikipedia.org/wiki/Selection_sort">selection sort</a> which you would use for numbers or <a href="http://en.wikipedia.org/wiki/Insertion_sort">insertion sort</a> which you would use for card games. No matter what algorithm you use, you need to be able to compare the elements. </p> <p>Note that you can compare some objects, like countries, by many measures. You could look at the population, the birth rate or the area. No matter what you use to compare, the this will not influence the way you sort.</p> <h2>Collections</h2> <p>One way to sort is to implement the interface <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html">List</a>. For all datastructures, that implement the interface List or one of its sub-interfaces you can use <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html">Collections</a> an go on like this:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.Collections</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">myList</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;I&quot;</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;think&quot;</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;therefore&quot;</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;I&quot;</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;am&quot;</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">myList</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">myList</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">myList</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>I, think, therefore, I, am<span class="o">]</span> <span class="o">[</span>I, I, am, therefore, think<span class="o">]</span> </code></pre></div> <p>Note that I didn&#39;t write a Comparator or implement Comparable as String has one by default. Don&#39;t mix <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html">Collections</a> and <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html">Collection</a>! A Set is a Collection, but it is not sortable. Collections is a class that you can use for sorting. Like <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html">Math</a>, that has utilities like <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#sqrt(double)">sqrt</a></p> <h2>Arrays</h2> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.Arrays</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">String</span><span class="o">[]</span> <span class="n">myStrings</span> <span class="o">=</span> <span class="k">new</span> <span class="n">String</span><span class="o">[</span><span class="mi">5</span><span class="o">];</span> <span class="n">myStrings</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;I&quot;</span><span class="o">;</span> <span class="n">myStrings</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;think&quot;</span><span class="o">;</span> <span class="n">myStrings</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;therefore&quot;</span><span class="o">;</span> <span class="n">myStrings</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;I&quot;</span><span class="o">;</span> <span class="n">myStrings</span><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;am&quot;</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">myStrings</span><span class="o">));</span> <span class="n">Arrays</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">myStrings</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">myStrings</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Interface Comparable</h2> <p>This is an example how you could implement <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html">Comparable</a>.</p> <p>Country.java</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Country</span> <span class="kd">implements</span> <span class="n">Comparable</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">population</span><span class="o">;</span> <span class="kt">double</span> <span class="n">area</span><span class="o">;</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">Country</span><span class="o">(</span><span class="kt">int</span> <span class="n">population</span><span class="o">,</span> <span class="kt">double</span> <span class="n">area</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">population</span> <span class="o">=</span> <span class="n">population</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">area</span> <span class="o">=</span> <span class="n">area</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="n">Country</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// a negative integer, zero, or a positive integer as this</span> <span class="c1">// object is less than, equal to, or greater than the</span> <span class="c1">// specified object.</span> <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span><span class="o">.</span><span class="na">compareTo</span><span class="o">(</span><span class="n">o</span><span class="o">.</span><span class="na">name</span><span class="o">);</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">name</span> <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">population</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Main.java</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Collections</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="n">europe</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;();</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">82000000</span><span class="o">,</span><span class="mi">350000</span><span class="o">,</span><span class="s">&quot;Germany&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">60000000</span><span class="o">,</span><span class="mi">360000</span><span class="o">,</span> <span class="s">&quot;France&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">20000000</span><span class="o">,</span><span class="mi">100000</span><span class="o">,</span> <span class="s">&quot;Norway&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">30000000</span><span class="o">,</span><span class="mi">500000</span><span class="o">,</span> <span class="s">&quot;Sweden&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">50000000</span><span class="o">,</span><span class="mi">123000</span><span class="o">,</span> <span class="s">&quot;Spain&quot;</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>Germany: 81903000, France: 64667000, Norway: 4985900, Sweden: 9514406, Spain: 47212990, Switzerland: 8014000, Monaco: 36371<span class="o">]</span> <span class="o">[</span>France: 64667000, Germany: 81903000, Monaco: 36371, Norway: 4985900, Spain: 47212990, Sweden: 9514406, Switzerland: 8014000<span class="o">]</span> </code></pre></div> <p>You should definitely add JavaDoc and comment what you&#39;ve compared. Note that it would sort the list in reverse order if you switched <code>this.population - o.population;</code> to <code>o.population - this.population;</code>. This would be bad style, as the JavaDoc of Comparable define the order. If you would like to sort in reverse, you should use <code>Collections.reverse(europe);</code>.</p> <p>You can also use compareTo() within compareTo():</p> <div class="highlight"><pre><code class="java"> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="n">Country</span> <span class="n">o</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span><span class="o">.</span><span class="na">compareTo</span><span class="o">(</span><span class="n">o</span><span class="o">.</span><span class="na">name</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <h2>Comparator</h2> <p>If you need to compare objects in multiple ways, you might need to implement <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T, T)">Comperator</a>. If you only have to compare objects in one way, I would always use the Interface Comparable. It&#39;s easier to use.</p> <h3>External Comparator</h3> <p>An external Comperator PopulationDensityComperator.java could look like this:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.Comparator</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">PopulationDensityComperator</span> <span class="kd">implements</span> <span class="n">Comparator</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="o">{</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compare</span><span class="o">(</span><span class="n">Country</span> <span class="n">o1</span><span class="o">,</span> <span class="n">Country</span> <span class="n">o2</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">o1Density</span> <span class="o">=</span> <span class="n">o1</span><span class="o">.</span><span class="na">population</span> <span class="o">/</span> <span class="n">o1</span><span class="o">.</span><span class="na">area</span><span class="o">;</span> <span class="kt">double</span> <span class="n">o2Density</span> <span class="o">=</span> <span class="n">o2</span><span class="o">.</span><span class="na">population</span> <span class="o">/</span> <span class="n">o2</span><span class="o">.</span><span class="na">area</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">o1Density</span> <span class="o">-</span> <span class="n">o2Density</span><span class="o">)</span> <span class="o">&lt;</span> <span class="mf">0.00001</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">0</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="k">return</span> <span class="n">o1Density</span> <span class="o">-</span> <span class="n">o2Density</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>and you would use it like this in the Main.java:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Collections</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="n">europe</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;();</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">81903000</span><span class="o">,</span><span class="mf">357121.41</span><span class="o">,</span><span class="s">&quot;Germany&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">64667000</span><span class="o">,</span><span class="mi">668763</span><span class="o">,</span> <span class="s">&quot;France&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">4985900</span><span class="o">,</span><span class="mi">385199</span><span class="o">,</span> <span class="s">&quot;Norway&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">9514406</span><span class="o">,</span><span class="mi">450295</span><span class="o">,</span> <span class="s">&quot;Sweden&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">47212990</span><span class="o">,</span><span class="mi">504645</span><span class="o">,</span> <span class="s">&quot;Spain&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">8014000</span><span class="o">,</span> <span class="mi">41285</span><span class="o">,</span> <span class="s">&quot;Switzerland&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">36371</span><span class="o">,</span> <span class="mf">2.02</span><span class="o">,</span> <span class="s">&quot;Monaco&quot;</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">europe</span><span class="o">,</span> <span class="k">new</span> <span class="n">PopulationDensityComperator</span><span class="o">());</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Your output would be:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>Germany: 81903000, France: 64667000, Norway: 4985900, Sweden: 9514406, Spain: 47212990, Switzerland: 8014000, Monaco: 36371<span class="o">]</span> <span class="o">[</span>France: 64667000, Germany: 81903000, Monaco: 36371, Norway: 4985900, Spain: 47212990, Sweden: 9514406, Switzerland: 8014000<span class="o">]</span> <span class="o">[</span>Norway: 4985900, Sweden: 9514406, Spain: 47212990, France: 64667000, Switzerland: 8014000, Germany: 81903000, Monaco: 36371<span class="o">]</span> </code></pre></div> <h3>Internal (anonymous) Comparator</h3> <p>You can also directly implement the comperator where you need it:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Collections</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Comparator</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;</span> <span class="n">europe</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;();</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">81903000</span><span class="o">,</span><span class="mf">357121.41</span><span class="o">,</span><span class="s">&quot;Germany&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">64667000</span><span class="o">,</span><span class="mi">668763</span><span class="o">,</span> <span class="s">&quot;France&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">4985900</span><span class="o">,</span><span class="mi">385199</span><span class="o">,</span> <span class="s">&quot;Norway&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">9514406</span><span class="o">,</span><span class="mi">450295</span><span class="o">,</span> <span class="s">&quot;Sweden&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span><span class="mi">47212990</span><span class="o">,</span><span class="mi">504645</span><span class="o">,</span> <span class="s">&quot;Spain&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">8014000</span><span class="o">,</span> <span class="mi">41285</span><span class="o">,</span> <span class="s">&quot;Switzerland&quot;</span><span class="o">));</span> <span class="n">europe</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Country</span><span class="o">(</span> <span class="mi">36371</span><span class="o">,</span> <span class="mf">2.02</span><span class="o">,</span> <span class="s">&quot;Monaco&quot;</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="n">Collections</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">europe</span><span class="o">,</span> <span class="k">new</span> <span class="n">Comparator</span><span class="o">&lt;</span><span class="n">Country</span><span class="o">&gt;(){</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">compare</span><span class="o">(</span><span class="n">Country</span> <span class="n">o1</span><span class="o">,</span> <span class="n">Country</span> <span class="n">o2</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">o1Density</span> <span class="o">=</span> <span class="n">o1</span><span class="o">.</span><span class="na">population</span> <span class="o">/</span> <span class="n">o1</span><span class="o">.</span><span class="na">area</span><span class="o">;</span> <span class="kt">double</span> <span class="n">o2Density</span> <span class="o">=</span> <span class="n">o2</span><span class="o">.</span><span class="na">population</span> <span class="o">/</span> <span class="n">o2</span><span class="o">.</span><span class="na">area</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">o1Density</span> <span class="o">-</span> <span class="n">o2Density</span><span class="o">)</span> <span class="o">&lt;</span> <span class="mf">0.00001</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">0</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">o1Density</span> <span class="o">&gt;</span> <span class="n">o2Density</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">1</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">});</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">europe</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Your output would be:</p> <div class="highlight"><pre><code class="bash"><span class="o">[</span>Germany: 81903000, France: 64667000, Norway: 4985900, Sweden: 9514406, Spain: 47212990, Switzerland: 8014000, Monaco: 36371<span class="o">]</span> <span class="o">[</span>France: 64667000, Germany: 81903000, Monaco: 36371, Norway: 4985900, Spain: 47212990, Sweden: 9514406, Switzerland: 8014000<span class="o">]</span> <span class="o">[</span>Norway: 4985900, Sweden: 9514406, Spain: 47212990, France: 64667000, Switzerland: 8014000, Germany: 81903000, Monaco: 36371<span class="o">]</span> </code></pre></div> <p>I don&#39;t recommend this way for some reasons: <ul> <li>It is more likely that your code gets more difficult to read</li> <li>It&#39;s more difficult to reuse your code (you can&#39;t use the same Comparator in another location)</li> <li>It&#39;s more difficult to extend your code</li> </ul></p> <p>An argument for such an Comparator might be, that it is easier to read. But this is only an argument if the Comparator is very short.</p> <h2>More examples</h2> <ul> <li>StackOverflow: <a href="http://stackoverflow.com/q/3718383/562769">java class implements comparable</a></li> </ul> Web Engineering http://martin-thoma.com/web-engineering Thu, 03 Jan 2013 12:57:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/web-engineering <div class="info">Dieser Artikel besch&auml;ftigt sich mit der Vorlesung &bdquo;Web Engineering&ldquo; am KIT. Er dient als Pr&uuml;fungsvorbereitung. Ich habe Web Engineering bei Dr. Nussbaumer geh&ouml;rt.</div> <h2>&Uuml;ber die Vorlesung</h2> <p>In der Vorlesung &bdquo;Web Engineering&ldquo; lernt man, welche besonderen Herausforderungen Web-Projekte beinhalten und wie man damit umgehen kann. Es wird zwar auch &uuml;ber technische Aspekte geredet (siehe Part 1), aber es geht vor allem um Projektplanung und -management. Insbesondere wird hier nichts konkret entwickelt. Daf&uuml;r gibt es vermutlich das Praktikum, das aber unabh&auml;ngig von der Vorlesung ist.</p> <p>Herr Dr. Nussbaumer h&auml;lt die Vorlesung sehr interaktiv. Er stellt viele Fragen, &uuml;ber die man in der Vorlesung diskutieren kann und ist auch immer nach der Vorlesung bereit etwas genauer zu erkl&auml;ren.</p> <p>Die Struktur unter &bdquo;Vorbereitung&ldquo; richtet sich nach dem Aufbau der Folien.</p> <h2>Vorbereitung</h2> <p>Pr&uuml;fungsprotokolle sind bei der <a href="http://www.fsmi.uni-karlsruhe.de/Studium/Pruefungsprotokolle/">Fachschaft Informatik</a> zu erhalten. <a href="../images/2013/01/muendlich-we-2013-martin-thoma.pdf">Mein Pr&uuml;fungsprotokoll</a> ist hier und die <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents/kit-muendlich-info">TeX-Quelldateien</a> bekommt ihr nat&uuml;rlich auch.</p> <p>Im Folgenden sind einige Stichpunkte aufgelistet, die jedem etwas sagen sollten.</p> <h3>Geschichte</h3> <ul> <li>1945: <a href="http://de.wikipedia.org/wiki/Vannevar_Bush">Vannevar Bush</a>, <a href="http://de.wikipedia.org/wiki/Memex">Memex</a></li> <li>1965: <a href="http://de.wikipedia.org/wiki/Ted_Nelson">Ted Nelson</a>, Hypertext und Xanadu</li> <li>1969: ARPANET</li> <li>1985: Bill Atkinson (Apple), <a href="http://www.youtube.com/watch?v=BeMRoYDc2z8">HyperCard</a></li> <li>1989: Tim Berners-Lee, World Wide Web</li> <li>1993: <a href="http://de.wikipedia.org/wiki/NCSA_Mosaic">Mosaic</a></li> </ul> <h3>PART 1: Technologies</h3> <ul> <li>Markup, HTML, Ressources, Cookies, <abbr title="Multipurpose Internet Mail Extensions"><a href="http://de.wikipedia.org/wiki/MIME-Type">MIME</a></abbr></li> <li>Host, Server, Client, User Agent</li> <li>Hypertext Paradigm</li> <li>HTTP, HTTPS, FTP, SMTP, UDDI</li> <li>CGI</li> <li><a href="http://de.wikipedia.org/wiki/SOAP">SOAP</a>, <a href="http://de.wikipedia.org/wiki/WebDAV">WebDAV</a></li> <li>Moore's Law, Nielson's Law</li> <li>Was ist der Unterschied zwischen Software Engineering und Web Engineering? &rarr; Antwort auf Folie 47ff, part0-1</li> <li><a href="http://de.wikipedia.org/wiki/Paretoprinzip">Paretoprinzip</a></li> <li>Was ist das W3C? Was sind die Ziele des W3C? Wer ist Teil des W3C?</li> <li><a href="http://de.wikipedia.org/wiki/Zonendatei">Zone File</a></li> <li>Uniform addressing &rarr; Was ist das?</li> <li>URI, URL, URN, URC, RFC1630</li> </ul> <h3>PART 2: Project Management</h3> <ul> <li><a href="http://de.wikipedia.org/wiki/Chaos-Studie">Chaos-Report</a> der Standish Group (25%, 45%, 30%) <ul> <li>Bad: Very high budget</li> <li>Good: Executive Management, User Involvement, Experienced Project Manager, Clear Business Objectives, Minimizing Scope, Requirements Process, Standard Software Infrastructure, Formal Methology, Reliable Estimates, Skilled Staff</li> <li>&bdquo;When projects fail, it's rarely technical.&ldquo;</li> </ul> </li> <li>Outsource, Find&Buy, Develop new solution</li> </ul> <p><strong>Teams:</strong> <ul> <li>&lt; 6 Entwickler</li> <li>&lt; 6 Monate</li> <li><abbr title="Release early, release often">RERO</abbr></li> <li>Verantwortungsbereiche: <ul> <li>Product Management: Wie verkaufe ich die Software?</li> <li>Program Management: Wie bringe ich das Projekt zu einem erfolgreichem Abschluss?</li> <li>Architekture: Wie halte ich die Software erweiterbar, anpassbar und wartbar?</li> <li>Development: Wie schreibe ich den Code von Methode abc in Klasse xyz?</li> <li>Test: Sind alle funktionalen und qualitativen Anforderungen erf&uuml;llt? Ist das System robust?</li> <li>User Experience: Passiert das, was der Nutzer erwartet? Kann man dem User die Bedienung der Software erleichtern?</li> <li>Release / Operations: Wie halte ich die Software &uuml;ber Jahre am laufen?</li> </ul> </li> <li>Aufsplitten der Teams nach Funktionen oder Features <ul> <li>Wo ist der Unterschied?</li> </ul> </li> </ul></p> <p><strong>Tasks &amp; Tools</strong> <ul> <li><a href="http://de.wikipedia.org/wiki/Work_Breakdown_Structure">Work Breakdown Structure</a></li> <li>GANTT chart</li> <li><a href="http://de.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique">PERT</a></li> <li><a href="http://en.wikipedia.org/wiki/SWOT_analysis">SWOT Analysis</a></li> </ul></p> <p><strong>Risiken</strong> <ul> <li>Cost-reduction expectations</li> <li>Data security / protection (IPR)</li> <li>Process discipline (Was ist das?)</li> <li>Loss of business knowledge</li> <li>Vendor failure to deliver</li> <li>Scope creep</li> <li>Government oversight / regulation</li> <li>Culture (language and callcenters)</li> <li>Turnover of key personnel</li> <li>Knowledge transfer</li> </ul></p> <p><strong>Process Models</strong> <ul> <li><a href="http://en.wikipedia.org/wiki/Code_and_fix#Code_and_fix">Code and fix</a></li> <li>Waterfall model</li> <li>Prototyping model</li> <li>Evolutionary Development model: Only for small, scientific projects where project goal is unclear</li> <li>Spiral model: Risk-driven</li> <li><abbr title="Rational Unified Process model">RUP</abbr> von SAP</li> <li><abbr title="Microsoft Solution Framework">MSF</abbr> &rarr; <a href="http://msdn.microsoft.com/de-de/library/bb979125.aspx">msdn Artikel</a> <ul> <li>Rollen: <ul> <li>Product Management: Anwalt des Kunden, team&uuml;bergreifende Projekt-Vision, betriebswirtschaftliche Sicht auf das Projekt</li> <li>Program Management: &bdquo;Projektleiter&ldquo;, Teamkommunikation, technische Sicht auf das Projekt</li> <li>Architecture, Development, Testing, Release / Operations</li> <li>User Experience: Anwalt des Benutzers</li> </ul> </li> <li>Skalierung: Feature-Teams vs. Functional Teams</li> <li>Meilensteine: Extern sichtbare und Interim-Meilensteine</li> </ul> </li> <li>Reuse-Oriented Approaches</li> <li>Agile Methoden: <ul> <li>Scrum: <ul> <li>Rollen: Scrum Master, Product Owner, Development Team</li> <li>Iterations, Sprints, User Stories</li> <li><a href="http://if-blog.de/scrum-plakat">Scrum Plakat</a></li> <li><a href="http://www.youtube.com/watch?v=r6brn76hDec">Video: What is Scrum?</a>, <a href="http://www.youtube.com/watch?v=XU0llRltyFM#t=32s">Scrum in 8 minutes</a>, <a href="http://refcardz.dzone.com/refcardz/scrum">Scrum Refcard</a>, <a href="http://sendspace.com/pro/dl/qh5zug">Scrum Master Checklist</a></li> </ul> </li> <li><abbr title="Extreme Programming">XP</abbr>: Paarprogrammierung, <a href="http://www.youtube.com/watch?v=XP4o0ArkP4s">Lecture 24: Richard Buckland</a> (45 minutes)</li> <li><a href="http://agilemanifesto.org/">Agile manifesto</a></li> </ul> </li> </ul></p> <h3>PART 3: Requirements Engineering</h3> <ul> <li>Ablauf: <ol> <li>Initiate: Project Charter, Identify business opportunity, gather business requirements, <abbr title="target customer">FOR</abbr> WHO <abbr title="product name">THE</abbr> <abbr title="product category">IS</abbr> <abbr title="key benefit">THAT</abbr> <abbr title="primary competition">UNLIKE</abbr> <abbr title="primary difference">OUR PRODUCT</abbr></li> <li>Elicitation: Refine requirements (Busines requirements, functional requirements, non-functional requirements), Coopers Persona-Ansatz (<a href="http://de.wikipedia.org/wiki/Persona_(Mensch-Computer-Interaktion)#Beispiel">Beispiele</a>)</li> <li>Asses: Understand and organize requirements, features and feature sets</li> <li>Specification: <a href="http://en.wikipedia.org/wiki/Software_Requirements_Specification">Software requirements specification</a></li> <li>Validation</li> </ol> </li> <li>Gather requirements (Interviewing, <a href="http://en.wikipedia.org/wiki/Job_shadowing">Shadowing</a>, surveys, brainstorming, user instructions - z.B. bei Atomkraftwerken gibt es wohl schon Prozessabl&auml;ufe)</li> <li><a href="http://dropsafe.crypticide.com/article/1006">A11Y, L10N, I18N, G11N</a>: <a href="http://de.wikipedia.org/wiki/BITV">BITV</a></li> <li>RNA: Relationship-Navigation Analysis</li> <li><a href="http://de.wikipedia.org/wiki/Web_Accessibility_Initiative">WAI</a></li> </ul> <h3>PART 4: Entwurf</h3> <p>Logischer Entwurf (Abstrakt: Wireframes, Navigation patterns) &harr; Physikalischer Entwurf (Konkret: UI Frameworks, Services)</p> <h4>Content Management Aspects</h4> <ul> <li>Content-Typen m&uuml;ssen definiert werden, um Inhalte von der Darstellung trennen zu k&ouml;nnen</li> <li>Content-Typen sind auch f&uuml;r die Suche relevant</li> <li>Templates m&uuml;ssen erstellt werden</li> <li>Welche Metadaten liegen vor?</li> <li>Wie k&ouml;nnen Metadaten weitergegeben werden? &rarr; <a href="http://support.google.com/webmasters/bin/answer.py?hl=en&answer=99170">Rich Snippets</a></li> <li>Welche <abbr title="Denglisch: Workflows">Arbeitsabl&auml;ufe</abbr> habe ich?</li> <li>Inhalt kann in flachen/strukturierten Dateien oder in Datenbanken liegen.</li> <li>Strukturierte Dateien: XML, RDF (&rarr; <a href="http://www.youtube.com/watch?v=ldl0m-5zLz4">Video</a>), Microformats</li> </ul> <h4>Software Interface Aspects</h4> <div class="definition"><em>Usability</em> is the extent to which a product can be used by specified users to achieve specified goals with effectiveness, efficiency and satisfaction in a specified context of use. - ISO 9241-11</div> <div class="definition">User Experience is a person's perception and responses that result from the use or anticipated use of a product, system or service. - ISO 9241-210</div> <ul> <li>User-centered design &rarr; <a href="http://en.wikipedia.org/wiki/User-centered_design">Wiki</a></li> <li>Mentale Modelle: Taschenrechner, Explorer, Start-Vorgang, Einkaufssysteme, Hyperlinks, Tastatur</li> <li>Metaphern</li> <li>User-Modelle: Rollen, Markt-Anteile, Personas</li> </ul> <h4>Hypertext Systm Aspects</h4> <ul> <li>Known-item search / exploratory search</li> </ul> <h4>Business Process Aspects</h4> <p>Kommt noch</p> <h3>Weiteres</h3> <ul> <li><a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language">WSDL</a></li> <li><a href="http://en.wikipedia.org/wiki/Microsoft_Solutions_Framework">MSF</a> vs. <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a> - <a href="http://pm.stackexchange.com/a/8493/5195">Roles in Scrum</a></li> <li><a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a></li> </ul> <h3>Weitere Informationen</h3> <p>Folgende Artikel sollte man lesen: <ul> <li><a href="http://de.wikipedia.org/wiki/Internet">Internet</a></li> <li><a href="http://de.wikipedia.org/wiki/Geschichte_des_Internets">Geschichte des Internets</a></li> <li><a href="http://de.wikipedia.org/wiki/Chronologie_des_Internets">Chronologie des Internets</a></li> </ul></p> <p>Diese Tutorials sollte man machen: <ul> <li><a href="http://www.w3schools.com/xml/xml_whatis.asp">XML Tutorial</a> - <a href="http://www.w3schools.com/quiztest/quiztest.asp?qtest=XML">XML Quiz</a></li> <li><a href="http://www.w3schools.com/soap/soap_intro.asp">SOAP Tutorial</a></li> </ul></p> <h2>Typische Fragen</h2> <div class="question"> <span class="question">Was ist Web Engineering?</span> <div class="answer"> <ul> <li>It's not science, and it isn't exactly engineering, either.</li> <li>Disziplin aus Disziplinen (Software Engineering, Hypermedia, Information Systems, Network Engineering)</li> <li>Teilweise ist es wie Software Engineering (Requirements engineering, reproduzierbare Erfolge durch strukturierte Herangehensweise), teilweise hat es typische Problemquellen, die im Software Engineering weniger verbreitet sind (Skalierbarkeit, Load balancing, Hypermedia).</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Was ist eine Ressource?</span> <div class="answer">Eine Ressource ist ein Objekt, dass von einem Webserver oder Websystem mittels eines standardisierten Protokolls ausgeliefert wird und durch einen MIME-Typen spezifiziert wird.</div> </div> <div class="question"> <span class="question">Wie werden Ressourcen adressiert?</span> <div class="answer">Durch URIs, meist URLs aber auch URNs.</div> </div> <div class="question"> <span class="question">Was ist ein Webservice?</span> <div class="answer">Ein Webservice ist eine Software-Anwendung, die mit einem URI eindeutig identifizierbar ist und deren Schnittstelle als XML-Artefakt definiert, beschrieben und gefunden werden kann. Diese Schnittstelle kann mit WSDL beschrieben werden. </div> <p></div></p> <div class="question"> <span class="question">Was ist das Endpoint-ABC?</span> <div class="answer"> Wurde durch die WCF gepr&auml;gt und ist <a href="http://stackoverflow.com/q/8893128/562769">z.B. so in der Web.config</a>. Das ABC steht f&uuml;r ... <ul> <li>Address (Wo ist der Endpoint?)</li> <li>Binding (Wie verbinde ich? Protokoll? Encoding?)</li> <li>Contract (Welche Informationen will ich &uuml;bertragen?)</li> </li> Siehe auch: <a href="http://fczaja.blogspot.de/2010/10/wcf-endpoint-abc.html">Filip's Technical Blog</a> </div> <p></div></p> <div class="question"> <span class="question">Welche Ziele verfolgt das W3C?</span> <div class="answer"> <ul> <li>Web for Everyone</li> <li>Web on Everything</li> <li>Knowledge Base</li> <li>Trust and Confidence</li> </ul> </div> <p></div></p> <div class="question"> <span class="question">Wie ist der Arbeitsprozess beim W3C?</span> <div class="answer"> Workshops &rarr; Notes from members &rarr; Briefing package with membership vote &rarr; Requirements Document &rarr; Working Draft &rarr; Candidate Recommendation &rarr; Proposed Recommendation &rarr; W3C Recommendation (<a href="http://en.wikipedia.org/wiki/W3C_recommendation">source</a>) </div> <p></div></p> <h2>Interessante Fragen</h2> <div class="question"> <span class="question">Vergleichen Sie RPCs und Web Services</span> <div class="answer"> <ul> <li>Web Services sind leichter skalierbar.</li> </ul> (Siehe auch: <a href="http://stackoverflow.com/a/1350982/562769">StackOverflow</a>) </div> <p></div></p> <div class="question"> <span class="question">Wie l&auml;uft ein HTTP-Request ab?</span> <div class="answer">Siehe <a href="http://www.tecchannel.de/netzwerk/management/401210/hypertext_transfer_protocol/index2.html">TechChannel.de</a> </div> <p></div></p> <h2>Hintergrundwissen</h2> <p><a href="http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/">What really happens when you navigate to a URL</a> <ul> <li><a href="http://stackoverflow.com/a/11021207/562769">OS-DNS-Cache on Linux</a></li> <li><a href="http://superuser.com/a/31691/64857">What exactly happens when you browse a website in your browser?</a> (fun to read)</li> <li><a href="http://stackoverflow.com/a/2092602/562769">What happens when you type in a URL in browser?</a> (well structured)</li> </ul></p> <h2>Termine</h2> <p>Web Engineering wird m&uuml;ndlich gepr&uuml;ft. Dazu muss man sich bei Herrn Matthias Keller (matthias.keller@kit.edu) melden und einen Termin ausmachen. Zus&auml;tzlich muss man sich &uuml;ber QISPOS anmelden.</p> <p><strong>Datum</strong>: Dienstag, der 19. Februar 2013 um 14:30 Uhr (individuell, siehe Organisation) <strong>Ort</strong>: Geb. 20.21 (SCC), Raum 303 (individuell, siehe Organisation) <strong>Dauer</strong>: 15 Minuten <strong>Punkte</strong>: 4 ECTS</p> Disable Wikipedia fundraising banner http://martin-thoma.com/disable-wikipedia-fundraising-banner Wed, 02 Jan 2013 14:10:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/disable-wikipedia-fundraising-banner <p>I didn&#39;t spend this year for Wikipedia because of the advertising. It really got on my nerves:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/wikipedia-advertising-300x85.png"><img src="../images/2013/01/wikipedia-advertising-300x85.png" alt="" width="300" height="85" class="size-medium wp-image-53041"/></a><p class="wp-caption-text"></p></div> <p>But you can simply disable it: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2013/01/wikipedia-disable-fundraiser-300x153.png"><img src="../images/2013/01/wikipedia-disable-fundraiser-300x153.png" alt="" width="300" height="153" class="size-medium wp-image-53051"/></a><p class="wp-caption-text"></p></div></p> <p>You only have to go to:</p> <p>Preferences &rarr; Gadgets tab &rarr; Browsing &rarr; check &quot;Suppress display of the fundraiser banner&quot;</p> <p>Now I&#39;m happy :-) </p> PDF-Printing on Windows 7 http://martin-thoma.com/pdf-printing-on-windows-7 Mon, 31 Dec 2012 16:23:10 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/pdf-printing-on-windows-7 <p>&quot;Printing&quot; files on PDF-printers is useful as you can save everything as a digital PDF file instead of printing it. </p> <p>I&#39;ve just installed <a href="http://www.heise.de/download/typing-test-tq-1128987.html">Typing Test TQ</a> for testing my typing speed and I wanted to save my results. This wasn&#39;t possible, but I could print them. So I thought I could print it to a PDF file and store it this way on my computer. Once again, I didn&#39;t think of Microsoft. </p> <h2>The Linux-Way</h2> <p>How would you solve this problem on a Debian machine? Well, most Debian machines would have a PDF printer pre-installed. So you would simply click on print, choose the PDF printer and be happy.</p> <p>If it is not pre-installed, type:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install cups-pdf </code></pre></div> <p>Now you can use a PDF printer.</p> <p>Done. It works.</p> <h2>The Windows-Way</h2> <p>Windows 7 does not have a PDF printer, but it has a &quot;Microsoft XPS Document Writer&quot;. Lets see what this is:</p> <h3>XPS</h3> <h4>General Information</h4> <p><a href="http://en.wikipedia.org/wiki/Open_XML_Paper_Specification">Open XML Paper Specification</a> is an open specification for a page description language and a fixed-document format originally developed by Microsoft as XML Paper Specification (XPS) that was later standardized by Ecma International as international standard ECMA-388. It is an XML-based specification, based on a new print path and a color-managed vector-based document format that supports device independence and resolution independence. OpenXPS was standardized as an open standard document format on June 16, 2009.</p> <h4>XPS vs. PDF</h4> <ul> <li><a href="http://en.wikipedia.org/wiki/Comparison_of_OpenXPS_and_PDF">Comparison of OpenXPS and PDF</a></li> <li><a href="http://superuser.com/questions/73206/xps-vs-pdf-whats-the-status">XPS vs PDF. What's the status?</a> on superusers</li> </ul> <h4>TL;DR</h4> <p>XPS is an alternative for PDF. It lacks program support compared to PDF.</p> <h3>Getting a PDF-Printer</h3> <p>After a quick search, I found <a href="http://www.cutepdf.com/Products/CutePDF/writer.asp">CutePDF</a>. Seems to work, but I don&#39;t give any malware-freeness-guarantees.</p> <p>Although I don&#39;t know if there is malware, there is definitely some spam content: <div style="width: 518px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-7-browser-toolbar.png"><img src="../images/2012/12/windows-7-browser-toolbar.png" alt="" width="518" height="413" class="size-full wp-image-52891"/></a><p class="wp-caption-text"></p></div></p> <p>Why can&#39;t it simply only install a PDF-printer without getting annoyed with toolbars? I never had this problem on Linux...</p> Unreal Tournament 2004 http://martin-thoma.com/unreal-tournament-2004 Mon, 31 Dec 2012 12:49:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/unreal-tournament-2004 <p>I am currently at home and I found <a href="http://en.wikipedia.org/wiki/Unreal_Tournament_2004">Unreal Tournament 2004</a> in my old stuff. Of course, I had to play it again :-)</p> <p>Before you start, you might want to get the latest version. You have to find the patches by yourself. According to <a href="http://liandri.beyondunreal.com/Unreal_Tournament_2004#Patches">this page</a>, you get all updates / bonus content with &quot;<a href="http://liandri.beyondunreal.com/Unreal_Tournament_2004#Bonus_Packs">Mega Pack</a>&quot; (201 MB). </p> <p>It&#39;s asthonishing that there is neither a possibility to upgrade the game within the game, nor an official source for patches. I guess providing a patches is an easy way to spread viruses. Do I have any chance to check if it&#39;s a valid patch or a patch with a virus?</p> <h2>Error</h2> <p>I played &quot;COPT - Camper and Sniper&quot; for about half an hour and got this error:</p> <blockquote>UT2004 Build UT2004_Build_[2005-11-23_16.22] OS: Windows NT 6.1 (Build: 7601) CPU: GenuineIntel PentiumPro-class processor @ 2133 MHz with 3764MB RAM Video: Intel(R) HD Graphics (2372) General protection fault! History: UObject::ConditionalDestroy <- UObject::GetFullName <- DispatchDestroy <- DispatchDestroys <- UObject::PurgeGarbage <- UObject::CollectGarbage <- UObject::StaticExec <- UEngine::Exec <- UGameEngine::Exec <- UPlayer::Exec <- UViewport::Exec <- UWindowsViewport::Exec <- APlayerController::execConsoleCommand <- (ExtendedConsole Package.ExtendedConsole @ Function Engine.Console.Tick : 002C) <- UObject::ProcessEvent <- (InteractionMaster Package.InteractionMaster, Function Engine.InteractionMaster.Process_Tick) <- UInteractionMaster::MasterProcessTick <- ULevel::Tick <- (NetMode=0) <- TickLevel <- UGameEngine::Tick <- Level Unbenannt <- UpdateWorld <- MainLoop <- FMallocWindows::Free <- FMallocWindows::Realloc <- 10910191 0 FArray <- FArray::Realloc <- 0*2 <- FMallocWindows::Free</blockquote> <h2>Some Links</h2> <ul> <li><a href="http://www.gamefaqs.com/pc/914986-unreal-tournament-2004/faqs/31756">Team stats</a> by Hammerlock770 (another version is <a href="../images/2012/12/ut2004-team-stats.txt">here</a>, if the linked site gets offline)</li> <li><a href="http://ut2004stats.epicgames.com/index.php">UT2004 Stats</a></li> <li><a href="http://forums.epicgames.com/forums/249-Unreal-Tournament-2003-2004">Official forum</a></li> </ul> My blog in 2012 http://martin-thoma.com/my-blog-in-2012 Sun, 30 Dec 2012 13:00:25 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/my-blog-in-2012 <p>I get a lot of data about my visitors which I would like to share. The following data is from 2012 of my domain martin-thoma.com. It was collected by Piwik. Note that I excluded my visits.</p> <h2>Articles</h2> <p>These articles had the most visitors: <ol> <li><a href="../how-to-draw-a-finite-state-machine/">How to draw a finite-state machine</a></li> <li><a href="../matrix-multiplication-python-java-cpp/">Performance of Matrix multiplication in Python, Java and C++</a></li> <li><a href="../latex-vorlage-fur-ein-lastenheft/">LaTeX-Vorlage f&uuml;r ein Lastenheft</a> (german)</li> <li><a href="../computer-science-jokes/">Computer Science Jokes</a></li> <li><a href="../wie-fuhre-ich-einen-induktionsbeweis/">Wie f&uuml;hre ich einen Induktionsbeweis?</a> (german)</li> </ol></p> <p>Recently, my article <a href="../frauenquote-am-kit/">Frauenquote am KIT</a> got also very popular.</p> <h2>Visitors</h2> <p>According to awstats: <ul> <li>Different users: 81,028</li> <li>Visits: 119,855</li> <li>Page accesses: 2,379,654</li> <li>Bytes sent: 27.95 GB</li> </ul></p> <p>According to Piwik: <div style="width: 414px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitor-increase.png"><img src="../images/2012/12/2012-visitor-increase.png" alt="" width="414" height="170" class="size-full wp-image-52691"/></a><p class="wp-caption-text"></p></div></p> <h3>Where do they come from?</h3> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-continent.png"><img src="../images/2012/12/2012-visitors-continent.png" alt="" width="494" height="250" class="size-full wp-image-52611"/></a><p class="wp-caption-text"></p></div> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-country.png"><img src="../images/2012/12/2012-visitors-country.png" alt="" width="494" height="250" class="size-full wp-image-52621"/></a><p class="wp-caption-text"></p></div> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-region.png"><img src="../images/2012/12/2012-visitors-region.png" alt="" width="494" height="250" class="size-full wp-image-52661"/></a><p class="wp-caption-text"></p></div> <h3>Hardware</h3> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-screen-size.png"><img src="../images/2012/12/2012-visitors-screen-size.png" alt="" width="494" height="250" class="size-full wp-image-52671"/></a><p class="wp-caption-text"></p></div> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-desktop-vs-mobile.png"><img src="../images/2012/12/2012-visitors-desktop-vs-mobile.png" alt="" width="494" height="250" class="size-full wp-image-52631"/></a><p class="wp-caption-text"></p></div> <h3>Software</h3> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-os.png"><img src="../images/2012/12/2012-visitors-os.png" alt="" width="494" height="250" class="size-full wp-image-52641"/></a><p class="wp-caption-text"></p></div> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-browser-family.png"><img src="../images/2012/12/2012-browser-family.png" alt="" width="494" height="250" class="size-full wp-image-52581"/></a><p class="wp-caption-text"></p></div> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-browser.png"><img src="../images/2012/12/2012-visitors-browser.png" alt="" width="494" height="250" class="size-full wp-image-52601"/></a><p class="wp-caption-text"></p></div> <div style="width: 457px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-browser-plugins.png"><img src="../images/2012/12/2012-browser-plugins.png" alt="" width="457" height="322" class="size-full wp-image-52591"/></a><p class="wp-caption-text"></p></div> <h3>Provider</h3> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-visitors-provider.png"><img src="../images/2012/12/2012-visitors-provider.png" alt="" width="494" height="250" class="size-full wp-image-52651"/></a><p class="wp-caption-text"></p></div> <h2>Referrers</h2> <div style="width: 467px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-referrers.png"><img src="../images/2012/12/2012-referrers.png" alt="" width="467" height="140" class="size-full wp-image-52701"/></a><p class="wp-caption-text"></p></div> <p>Obviously, search engines are much more important for my website than other websites. Visitors who find me with Google, use these terms: <ol> <li>&quot;lastenheft vorlage&quot; or &quot;lastenheft beispiel&quot; &rarr; <a href="../latex-vorlage-fur-ein-lastenheft/">LaTeX-Vorlage f&uuml;r ein Lastenheft</a></li> <li>&quot;induktionsbeweis&quot; &rarr; <a href="../wie-fuhre-ich-einen-induktionsbeweis/">Wie f&uuml;hre ich einen Induktionsbeweis?</a></li> <li>&quot;computer science jokes&quot; &rarr; <a href="../computer-science-jokes/">Computer Science Jokes</a></li> <li>&quot;basiswechselmatrix&quot; &rarr; <a href="../wie-bestimme-ich-die-basiswechselmatrix/">Wie bestimme ich die Basiswechselmatrix?</a></li> <li>&quot;chomsky normalform&quot; &rarr; <a href="../konstruktion-der-chomsky-normalform/">Konstruktion der Chomsky-Normalform</a></li> </ol></p> <h2>Spam</h2> <p>Akistmet got a lot of comment spam on my blog:</p> <div style="width: 535px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-akismet-stats-total.png"><img src="../images/2012/12/2012-akismet-stats-total.png" alt="" width="535" height="157" class="size-full wp-image-52721"/></a><p class="wp-caption-text"></p></div> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/12/2012-akismet-stats.png"><img src="../images/2012/12/2012-akismet-stats.png" alt="" width="512" height="214" class="size-full wp-image-52711"/></a><p class="wp-caption-text"></p></div> How fast are electrons moving? http://martin-thoma.com/how-fast-are-electrons-moving Fri, 28 Dec 2012 06:04:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-fast-are-electrons-moving <p>I&#39;ve recently learned something about electric circuits. The ideal model of circuits does ignore that electrons actually need time to pass the components of the circuit. So we introduced the &quot;dead time model&quot;. So we added a model component for each real component that does only delay the incoming signal. But I&#39;ve wondered if dead time of a cable wasn&#39;t important, too. So I thought the question would be <em>How fast are electrons moving in a cable?</em>, but I just realized that the question is <em>How fast does a signal move in a wire?</em>.</p> <h2>How fast are electrons moving through a wire?</h2> <p>If you have electric current <code>$I$</code> (measured in Ampere), the wire is a cylindric conductore with a cross-sectional area of <code>$A$</code>, <code>$e = -1.6021766 \cdot 10^{-19} C$</code> (coulombs) is the charge of an electron an <code>$Q$</code> is <code>$\frac{\text{mobile electrons}}{\text{volume}}$</code>. <code>$v = \frac {I}{QeA}$</code></p> <p>According to this source, <code>$Q = 8.5 \cdot 10^{22} \frac{1}{cm^3}$</code> for copper. If <code>$I=1 A$</code> and if your wire has a radius of 0.5mm, you get: <code>$v= \frac{1 A}{ 8.5 \cdot 10^{22} \frac{1}{cm^3} \cdot e \cdot ((0.5mm)^2 \cdot pi)} = 9.349 \cdot 10^{-5} \frac{m}{s} = $</code> (see <a href="http://www.wolframalpha.com/input/?i=%281+A%29%2F%288.5+*+10%5E%2822%29%2F%28cm%5E3%29+*+%28charge+of+an+electron%29+*+%28%280.5mm%29%5E2+*+pi%29%29">Wolfram|Alpha</a>).</p> <p>Hmm ... seems to be very slow. Is my calculation correct?</p> <h2>How fast are electrical signals moving through a wire?</h2> <p>See <a href="http://physics.stackexchange.com/a/47635/7197">physics.stackexchange.com</a></p> <p><code>$v = \frac{c}{\sqrt{\mu_r \varepsilon_r}}$</code></p> <p>where <code>$\varepsilon_r$</code> is <a href="http://en.wikipedia.org/wiki/Relative_permittivity">relative permittivity</a> and <code>$\mu_r$</code> is <a href="http://en.wikipedia.org/wiki/Permeability_(electromagnetism)#Relative_permeability">relative magnetic susceptibility</a>.</p> <p>For copper: <code>$\mu_r = 0.999994$</code> <code>$\varepsilon_r = 3$</code>, as you can&#39;t measure permeability of metallic conductors (see &quot;Elektromagnetische Felder und Wellen&quot;. Paul Lorrain, Dale R. Corson, Fran&ccedil;ois Lorrain, page 75) <code>$v = \frac{c}{\sqrt{0.999994 \cdot 3}} = 0.577352 \cdot c$</code></p> <h2>How fast are electrons moving around an atom?</h2> <p>Well, first of all I have to mention, that electrons seem not to move around a nucleus as this image suggests:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/atom-electron-bohr-300x300.png"><img src="../images/2012/12/atom-electron-bohr-300x300.png" alt="" width="300" height="300" class="size-medium wp-image-52041"/></a><p class="wp-caption-text"></p></div> <p>A model with <a href="http://en.wikipedia.org/wiki/Atomic_orbital">atomic orbitals</a> seems to be more accurate. However, you can calulate the speed <code>$v$</code> an electron would have in Bohrs model.</p> <p>The centripedal force is <code>$F_Z = \frac{m \cdot v^2}{r}$</code> This force pushes the electron away from the nucleus.</p> <p>The coulomb-force is <code>$F_C = \frac{e^2}{4 \pi \varepsilon_0 r^2}$</code> where <code>$\varepsilon_0 \approx 8.8541 \cdot 10^{-12} \frac{F}{m}$</code> is <a href="http://en.wikipedia.org/wiki/Permittivity">permittivity</a>.</p> <p>Now you calculate: <code>$\begin{align}F_\mathrm{C} = F_\mathrm{Z} \quad &amp;\Leftrightarrow \quad \frac{e^2}{4 \pi \varepsilon_0 r^2} = \frac{m_{e}v^2}{r}\\ &amp;\Leftrightarrow \quad v^2 = \frac{e^2}{4 \pi \varepsilon_0 r m_e} = \frac{e^2}{4 \pi \varepsilon_0 m_e} \cdot \frac{1}{r} \end{align}$</code></p> <p>Ok, we&#39;re almost there. But how do we get <code>$r$</code>? Well, you have to know this equation: <code>$ m_{e} v r = n \hbar$</code> where <code>$n$</code> is the <a href="http://en.wikipedia.org/wiki/Principal_quantum_number">principal quantum number</a> and <code>$\hbar$</code> is the <a href="http://en.wikipedia.org/wiki/Planck_constant">reduced Planck constant</a>. So you get: <code>$\Leftrightarrow r = \frac{n \hbar}{v m_e}$</code></p> <p>Now insert this in the equation above: <code>$\begin{align} v^2 &amp;= \frac{e^2}{4 \pi \varepsilon_0 m_e} \cdot \frac{1}{\frac{n \hbar}{v m_e}}\\ \Rightarrow v &amp;= \frac{e^2}{4 \pi \varepsilon_0 n \hbar} \end{align}$</code></p> <p>Lets take a hydrogen nucleus (<code>$n=1$</code>): We get <code>$2.19 \cdot 10^6 \frac{m}{s} \approx 7.88 \cdot 10^6 \frac{km}{h}$</code> (see <a href="http://www.wolframalpha.com/input/?i=%28charge+of+electron%29%5E2%2F%284+pi+epsilon_0+h+bar%29">Wolfram|Alpha</a>). This is much less than 1% of the speed of light (which is <code>$1.079 \cdot 10^9 \frac{km}{h}$</code>)</p> <h2>Sources</h2> <p>Very good: <ul> <li><a href="http://physics.stackexchange.com/q/20187/7197">How fast do electrons travel in an atomic orbital?</a></li> <li><a href="http://physics.stackexchange.com/q/6177/7197">How fast do electrons move through a conductor?</a> &rarr; <a href="http://amasci.com/miscon/speed.html">SPEED OF &quot;ELECTRICITY&quot;</a></li> <li><a href="http://physics.stackexchange.com/q/15704/7197">Explanation for speed of an electrical impulse</a></li> </ul></p> <p>Not so good: <ul> <li><a href="http://en.wikipedia.org/wiki/Drift_velocity">Drift velocity</a></li> <li><a href="http://en.wikipedia.org/wiki/Speed_of_electricity">Speed of electricity</a></li> <li><a href="http://en.wikipedia.org/wiki/Wave_propagation_speed">Wave propagation speed</a></li> </ul></p> C++ Preprocessor Snippets http://martin-thoma.com/c-preprocessor-snippets Tue, 25 Dec 2012 18:32:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/c-preprocessor-snippets <p>The C++ Preprocessor - which is in fact the same as the C Preprocessor - provides some very basic, but powerful abilities. I haven&#39;t used them quite often, but I have seen some nice examples. So here are some C++ Preprocessor Snippets: <h2>Maximum / Minimum</h2> If you want to find the maximum / minimum of two elements, no matter of which type, you can do something like this:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define MAX(a, b) ((a &lt; b) ? b : a)</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">MAX</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="mi">1337</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">MAX</span><span class="p">(</span><span class="mi">1337</span><span class="p">,</span> <span class="mi">42</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">MAX</span><span class="p">(</span><span class="o">-</span><span class="mi">1337</span><span class="p">,</span> <span class="mi">42</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">MAX</span><span class="p">(</span><span class="mf">1337.0</span><span class="p">,</span> <span class="mi">42</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Absolute Value</h2> <p>You can get the absolute value like this:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define ABS(a) (a &lt; 0 ? -(a) : a)</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">42</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="mi">43</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1337</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ABS</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ABS</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ABS</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ABS</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>By the way, brackets around <code>a</code> are important, because without them you could get:</p> <div class="highlight"><pre><code class="text">a=1,b=3 ABS(a-b) = ABS(1-3) = (1-3 &lt; 0 ? -1-3 : 1-3) = -2 &lt; 0 ? -4 : -2 = -4 </code></pre></div> <h2>Swap variable content</h2> <p>This is an example for a multiline replacement.</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#define SWAP(a, b) { int tmp; \</span> <span class="cp"> tmp = b; \</span> <span class="cp"> b = a; \</span> <span class="cp"> a = tmp; \</span> <span class="cp"> }</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">42</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span> <span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">a</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">b</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/C_preprocessor">C preprocessor</a></li> <li>Tips and tricks using the preprocessor: <a href="http://www.iar.com/Global/Resources/Developers_Toolbox/C_Cplusplus_Programming/Tips%20and%20tricks%20using%20the%20preprocessor%20(part%20one).pdf">Part one</a> - <a href="http://www.iar.com/Global/Resources/Developers_Toolbox/C_Cplusplus_Programming/Tips%20and%20tricks%20using%20the%20preprocessor%20(part%20two).pdf">part two</a><br/> A very good article about the meaning of #import, #error, #pragma. It is written very well and has some examples.</li> <li>Obfuscated C: <a href="http://www.cise.ufl.edu/~manuel/obfuscate/pi.c">Calculate PI</a></li> </ul> <p>Do you know more preprocessor snippets that are used very often or which are interesting?</p> Wie wendet man den Transformationssatz an? http://martin-thoma.com/wie-wendet-man-den-transformationssatz-an Sat, 22 Dec 2012 21:43:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-wendet-man-den-transformationssatz-an <div class="info">Folgender Artikel basiert auf meinem Mitschrieb der Analysis III &Uuml;bung bei Herrn Bolleyer.</div> <p>Sei <code>$A \in \mathfrak{B}_d$</code> mit <code>$A^0 \neq \emptyset$</code> und <code>$\lambda_d (A \setminus A^0) = 0$</code> sowie <code>$\phi \in C^1(U, \mathbb{R}^d)$</code> mit <code>$U \subseteq \mathbb{R}^d$</code> offen und <code>$A \subseteq U$</code>. Weiter sei <code>$\phi$</code> auf <code>$A^0$</code> injektiv und <code>$\det(\phi&#39;(x)) \neq 0$</code> f&uuml;r <code>$x \in A^0$</code>. Sei <code>$f \in \mathfrak{L}^1(\phi(A))$</code> oder <code>$f \geq 0$</code> auf <code>$A$</code> so gilt <code>$\int_{\phi(A)} f(x) dy = \int_A f(\phi(x)) | \det(\phi&#39;(x)) | dx$</code></p> <p>In Anwendungen: <code>$Y \in \mathfrak{B}_d$</code> und <code>$f: Y \rightarrow \overline{\mathbb{R}}$</code> messbar.</p> <p><strong>Aufgabe</strong>: Berechne <code>$\int_Y f(x) dy$</code> falls es existiert. <strong>Vorgehensweise:</strong> <ol type="i" style="list-style-type:lower-roman;"> <li>Zeige <code>$f$</code> integrierbar oder <code>$f \geq 0$</code> auf <code>$Y$</code></li> <li>Finde <code>$A \in \mathfrak{B}_d$</code> und <code>$\phi: A \rightarrow \mathbb{R}^d$</code> mit <code>$\phi(A) = Y$</code> und den obigen Eigenschaften<br/> <code>$\phi$</code> sollte so gew&auml;hlt sein, dass die sp&auml;teren Rechenwege relativ einfach werden.</li> <li>Berechne <code>$\int_{Y} f(y) dy = \int_{\phi(A)} f(y) dy = \int_{A} f(\phi(x)) |\det (\phi&#39;(x)) | dx$</code></li> </ol></p> <h2>Beispiele</h2> <p>Sei <code>$Y := \{(x,y) \in \mathbb{R}^2 | 1 \leq \| (2,2) - (x,y)\| \leq 2\}$</code>. Setze <code>$\phi : \mathbb{R}^2 \rightarrow \mathbb{R}^2$</code> mit <code>$\phi(r, \varphi) := \begin{pmatrix}2\\2\end{pmatrix} + r \cdot \begin{pmatrix}\cos(\varphi)\\ \sin(\varphi) \end{pmatrix}$</code></p> <p><code>$\phi \in C^1(\mathbb{R}^2, \mathbb{R}^2)$</code> und f&uuml;r <code>$r \in \mathbb{R}$</code> gilt <code>$\det \phi&#39;(r, \varphi) = \det \left ( \begin{array}{cc} \cos(\varphi) &amp; - r \sin(\varphi)\\ \sin(\varphi) &amp; r \cos (\varphi) \end{array} \right ) = r$</code></p> <p>F&uuml;r <code>$r \neq 0$</code> gilt also <code>$\det \phi&#39;(r, \varphi) \neq 0$</code> f&uuml;r jedes <code>$\varphi \in \mathbb{R}$</code>. <code>$\phi$</code> ist nicht injektiv auf <code>$\mathbb{R}^2$</code>. Setze <code>$A := [1,2] \times [0, 2\pi]$</code>.</p> <p>Dann ist <code>$A^0 = (1,2) \times (0,2 \pi)$</code> und<code>$ \phi$</code> auf <code>$A^0$</code> injektiv. Au&szlig;erdem ist <code>$\det \phi&#39;(x) \neq 0$</code> f&uuml;r <code>$x \in A^0$</code>. </p> <p>F&uuml;r <code>$f:Y \rightarrow \mathbb{R}$</code> mit <code>$f(Y_1, Y_2) := Y_1 - Y_2$</code> gilt <code>$f \in \mathfrak{L}^1(Y)$</code> (<code>$Y$</code> kompakt, <code>$f$</code> stetig)</p> <p>Au&szlig;erdem: <code>$\begin{align} \int_Y f(y) dy &amp;= \int_\phi(A) f(y) dy \\ &amp;\stackrel{Tr}{=} \int_A f(\phi(r, \varphi)) |\det \phi&#39;(r, \varphi)| d(r, \varphi) \\ &amp;= \int_A r(2 + r \cos(y) - 2 - r \sin(\varphi)) d(r, \varphi) \\ &amp;= \int_1^2 (\int_0^{2\pi} r^2 (\cos \varphi - \sin \varphi d \varphi) dr \\ &amp;= \underbrace{(\int_1^2 r^2 dr)}_{&lt; \infty} \underbrace{(\int_0^{2\pi} \cos \varphi - \sin \varphi d \varphi)}_{= 0}\\ &amp;= 0 \end{align}$</code></p> Blender Open Movies http://martin-thoma.com/blender-open-movies Sat, 22 Dec 2012 16:00:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/blender-open-movies <h2>Big Buck Bunny</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/YE7VzlLtp-4" frameborder="0" allowfullscreen></iframe> <h2>Elephants Dream</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/TLkA0RELQ1g" frameborder="0" allowfullscreen></iframe> <h2>Sintel</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/eRsGyueVLvQ" frameborder="0" allowfullscreen></iframe> <h2>More information</h2> <ul> <li><a href="http://www.sintel.org/">www.sintel.org</a></li> <li>Soundtrack: <a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=AeFwEnyMl8A">I Move On</a></li> </ul> Why are Microsoft products so User unfriendly? http://martin-thoma.com/why-are-microsoft-products-so-user-unfriendly Fri, 21 Dec 2012 16:00:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/why-are-microsoft-products-so-user-unfriendly <p>Another rage-post ... </p> <h2>Loading times</h2> <p>Did you ever work with eclipse? Then you might know the feeling, that it takes an eternity until Eclipse has started. I&#39;ve just stopped it. </p> <p>Eclipse takes 30 seconds to start: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/eclipse-juno-loading-300x200.png"><img src="../images/2012/12/eclipse-juno-loading-300x200.png" alt="" width="300" height="200" class="size-medium wp-image-51161"/></a><p class="wp-caption-text"></p></div></p> <p>Visual Studio 2012 takes 1 minute and 15 seconds to start: <div style="width: 229px" class="wp-caption aligncenter"><a href="../images/2012/12/visual-studio-2012-loading-229x300.png"><img src="../images/2012/12/visual-studio-2012-loading-229x300.png" alt="" width="229" height="300" class="size-medium wp-image-51171"/></a><p class="wp-caption-text"></p></div></p> <p>But that&#39;s not the worst. It&#39;s okay if it takes long to start, if it&#39;s later a swift. But it&#39;s not. I get those loading screens from time to time without having done anything:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/visual-studio-2012-loading-times-300x202.png"><img src="../images/2012/12/visual-studio-2012-loading-times-300x202.png" alt="" width="300" height="202" class="size-medium wp-image-51181"/></a><p class="wp-caption-text"></p></div> <p>Why is it loading something from time to time without interaction? What does Visual Studio load?</p> <h2>Control</h2> <p>The next big problem I have with Microsoft products is the lack of control. I would like to know what are the effects of a command I use before I use it - no matter if it is a command line command or a GUI or key-press-combination command. As it is very difficult to make GUI commands unambiguous, I really like the command line for some tasks. Why doesn&#39;t Windows offer a default command line that is usable? I mean, yes, you have the PowerShell ... but why isn&#39;t it the default shell? Why does the user have to know that there are other (better?) shells? Is there any reason not to use the PowerShell in Windows 7? And even the PowerShell misses some really basic tools. I mean, did you try the path autocompletion (with tab) on bash (the Linux shell)? It completes the path / command, if there is only one possibility. If there are more possibilities, the user gets displayed all options (if there are too many, he will get asked before all are displayed). The Windows-shells go through each possibility. </p> <p>Here are some screenshots of the shells displaying the content of the current folder: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/CWindowssystem32cmd-300x204.png"><img src="../images/2012/12/CWindowssystem32cmd-300x204.png" alt="" width="300" height="204" class="size-medium wp-image-51251"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/WindowsPowerShellv1.0-300x231.png"><img src="../images/2012/12/WindowsPowerShellv1.0-300x231.png" alt="" width="300" height="231" class="size-medium wp-image-51261"/></a><p class="wp-caption-text"></p></div> <p>Now compare this to Linux:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/gnome-shell-300x117.png"><img src="../images/2012/12/gnome-shell-300x117.png" alt="" width="300" height="117" class="size-medium wp-image-51271"/></a><p class="wp-caption-text"></p></div> <p>Where do you find easier what you need? And why do they have a black background with white font color? Try to work with this for some hours and than compare it to a shell with black font size and white background...</p> <h3>Missing (command line) tools</h3> <p>I like using git / svn from command line. But the default way to use SVN (and eventually GIT) seems to be by GUI. Why results in a crappy, overblown right click menu:</p> <div style="width: 287px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-right-click-287x300.png"><img src="../images/2012/12/windows-right-click-287x300.png" alt="" width="287" height="300" class="size-medium wp-image-51291"/></a><p class="wp-caption-text"></p></div> <p>Now compare this to Linux 10.04 with GNOME: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/gnome-2-right-click-300x292.png"><img src="../images/2012/12/gnome-2-right-click-300x292.png" alt="" width="300" height="292" class="size-medium wp-image-51311"/></a><p class="wp-caption-text"></p></div></p> <p>And I should also mention that I didn&#39;t clean up my Linux system for over one year. I use it every day, install new software, remove software, forget to remove software. I have git and svn on my Linux machine as well as Apache, Python, some games, ...</p> <p>The Windows 7 machine is a fresh install. It has better hardware and I only use it for work (so it basically only has TurtoiseSVN, Visual Studio and IIS). I guess this would be even worse if I used it every day.</p> <h3>Updates</h3> <p>Windows makes its updates at very bad times. Sometimes it just makes an update and you have to wait for quarter of an hour to finish it, before you can shut down. Why? Can&#39;t you just ask the user before you make an update? A friend of mine had a tutorial after which she wanted to go to a Christmas party. Guess what happened: Before she could shut down the computer, Windows decided to make automatically an update. Took about 15 - 20 minutes. No Christmas parties for Windows users.</p> <div style="width: 426px" class="wp-caption aligncenter"><a href="../images/2012/12/shutdown-windows.png"><img src="../images/2012/12/shutdown-windows.png" alt="" width="426" height="362" class="size-full wp-image-54251"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-7-automatic-update-installation-300x225.jpg"><img src="../images/2012/12/windows-7-automatic-update-installation-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-54261"/></a><p class="wp-caption-text"></p></div> <p>Windows really shut down my computer automatically and blocked it for about 15 minutes. What if I had to hold a presentation? What if I downloaded something?</p> <h2>Nice features, crappy realization</h2> <p>Windows has a very nice feature: You an search at the &quot;start&quot;. But why doesn&#39;t it work for every program? I&#39;ve searched for &quot;winver.exe&quot;, a program shipped per default from Microsoft. Why can&#39;t you find this in start? <div style="width: 240px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-start-search-240x300.png"><img src="../images/2012/12/windows-start-search-240x300.png" alt="" width="240" height="300" class="size-medium wp-image-51281"/></a><p class="wp-caption-text"></p></div></p> <p>If I have to type the whole name, this feature is essentially useless...</p> <p><a href="http://en.wikipedia.org/wiki/Outlook_Web_App">Microsoft OWA</a> is an online email service. A friend showed me this usability desaster: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/microsoft-owa-300x157.png"><img src="../images/2012/12/microsoft-owa-300x157.png" alt="" width="300" height="157" class="size-medium wp-image-54791"/></a><p class="wp-caption-text"></p></div></p> <h2>No structure for programs</h2> <p>Where do programs get installed? <ul> <li>C:&lt;/li&gt; <li>C:\Program Files</li> <li>C:\Program Files (x86)</li> </ul></p> <p>If you have a German system, the explorer will show a German path although the underlying path is English. What the hell? And <a href="../microsoft-product-flavor-hell/" title="Microsoft product flavor hell">switching languages isn&#39;t easy on Microsofts Systems</a>.</p> <h2>Drivers</h2> <h3>Installation CD</h3> <p>Although many drivers exist for Windows, you have to install them almost always by CD.</p> <h3>Mouse drivers</h3> <p>You have to INSTALL mouse drivers! WTF! I expect an USB mouse to work immediately and not to get something like that: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/usb-mouse-windows-7-300x101.png"><img src="../images/2012/12/usb-mouse-windows-7-300x101.png" alt="" width="300" height="101" class="size-medium wp-image-52321"/></a><p class="wp-caption-text"></p></div></p> <h2>Windows Explorer</h2> <h3>No tabs</h3> <p>Clover tries to fix that, but I don&#39;t want to install a third party tool for such a basic tool.</p> <h3>Structure</h3> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-7-explorer-300x220.png"><img src="../images/2012/12/windows-7-explorer-300x220.png" alt="" width="300" height="220" class="size-medium wp-image-52481"/></a><p class="wp-caption-text"></p></div> <h2>Shell</h2> <p>There is so much wrong with the Windows Shells: <ul> <li>You can&#39;t maximize it (see <a href="http://superuser.com/a/80098/64857">explantation</a>)</li> <li>Crappy autocomplete: In Linux, if you have multiple ways to autocomplete, you get a list of the options. Windows 7 only pics the first.</li> <li>PowerShell: Its soooo slow! I don&#39;t want to wait for my shell to start!</li> </ul></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/full-screen-terminal-300x169.png"><img src="../images/2012/12/full-screen-terminal-300x169.png" alt="" width="300" height="169" class="size-medium wp-image-54771"/></a><p class="wp-caption-text"></p></div> <h2>A wrap-up for Windows 8</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/WTYet-qf1jo" frameborder="0" allowfullscreen></iframe> <h2>Microsoft Bob</h2> <p>Have you ever heard of <a href="http://en.wikipedia.org/wiki/Microsoft_Bob">Microsoft Bob</a>? I guess we should not complain about Windows 8 desktop, if you have seen this desktop environment interface...</p> <iframe width="512" height="384" src="http://www.youtube.com/embed/ZegWedG-jk4" frameborder="0" allowfullscreen></iframe> How can I sketch an application? http://martin-thoma.com/how-can-i-sketch-an-application Thu, 20 Dec 2012 00:54:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-can-i-sketch-an-application <p>I&#39;ve recently participated in a medium size software project. This project is rather fixed for a web project, so we don&#39;t suffer from rapid changes (&quot;rapid&quot; in terms of other web applications), but nether the less they change. The task seemed to be clear at the beginning, but bit for bit my team of developers discovered details that were not so clear. In this project I have learned that a GUI / prototype driven development can be of great benefit. I assumed this beforehand, but I didn&#39;t expect how much it helped.</p> <p>So, I had the idea to create a good GUI to have something to talk about. How do you create a GUI for a web project? </p> <h2>HTML</h2> <ul> <li>is quite simple</li> <li>I know it very well</li> <li>everything I write is obviously possible to realize</li> </ul> <p>but </p> <ul> <li>the result looks too much like the resulting product. The customer might think that we already have some functional prototype <li>it is also unsatisfying to print HTML pages or screenshots of rendered browser views</li> <li>although HTML is easy, arranging items on a screen might take a while</li> </ul> <h2>GIMP</h2> <p>GIMP was the next option I tried, but its disadvantage is too severe to think seriously about using it for rapid GUI prototyping: It takes ages!</p> <p>A friend of mine helped me out of my misery. He told me of a product called &quot;<a href="http://www.balsamiq.com/">Balsamiq</a>&quot;. </p> <h2>Balsamiq</h2> <p>Balsamiq is easy to use, has a lot of very intuitive features and is able to generate a linked PDF. This means, you can add links to some parts of the interface and simulate interactivity. The user should have opened the slides in full screen, so that on slide fills the screen. Then you might even think it was an web application.</p> <p>Here is <a href='../images/2012/12/Scientific-publishing.pdf'>an example PDF created with Balsamiq</a></p> <h3>What's great about Balsamiq</h3> <p>Balsamiq was carefully designed, is available (and working!) on Windows 7 and Ubuntu 10.04 and via browser. The learning curve is very well. I keep finding new features as I need them. So I first intuitively found the most important ones and recognized advanced ones later.</p> <p>Here are two screenshots of the GUI of the Balsamiq web service:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/balsamiq-tabs-bar-300x137.png"><img src="../images/2012/12/balsamiq-tabs-bar-300x137.png" alt="" width="300" height="137" class="size-medium wp-image-51021"/></a><p class="wp-caption-text"></p></div> <p>Do you see the arrow-symbol? This looks very cool in drafts. Why doesn&#39;t GIMP provide anything similar?</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/balsamiq-edit-300x138.png"><img src="../images/2012/12/balsamiq-edit-300x138.png" alt="" width="300" height="138" class="size-medium wp-image-51031"/></a><p class="wp-caption-text"></p></div> <h3>What I've missed</h3> <p>No application is perfect, so I also found some specials that Balsamiq didn&#39;t offer: <ul> <li>Form elements in tables</li> <li>Adjusting table column width</li> </ul></p> <p>I&#39;ve found workarounds for both problems, but I guess there could be a better way to solve it. Nevertheless, Balsamiq is a great application that might help a lot to develop great software!</p> When advertising becomes spam http://martin-thoma.com/when-advertising-becomes-spam Wed, 19 Dec 2012 11:24:20 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/when-advertising-becomes-spam <p>The Web is great. You can easily find and publish information. It is great for trading as you can search through millions of articles and hundreds of vendors to find the product that fits best to your needs and is as cheap as possible. But recently I get a lot of spam from companies I like (<a href="http://en.wikipedia.org/wiki/Amazon.com">Amazon</a>, <a href="http://en.wikipedia.org/wiki/PayPal">PayPal</a> and <a href="http://en.wikipedia.org/wiki/Thalia_(bookstore_chain)">Thalia</a>). I like to get some emails from those companies. But how can they provide relevent content instead of spam? When is it good advertising and when does advertising become spam?</p> <h2>Intervall of Emails</h2> <p>As a rule of thumb, I would say more emails without user-interaction than once a month is spam. So it is perfectly fine if I buy ten products in one week to get ten sales confirmation emails. But is not okay to get more than once a month information about the cheapest products, the latest cupons or the latest electronics that I could buy as a present for christmas. Of course, if the user has actively changed the interval of emails to once a week or even every day, it is okay to sent him emails every day. But this should be opt-in. So the user has to get active to get those emails.</p> <h2>Easy unsubscribe</h2> <p>In every email should be a link to unsubscribe from this type of mail. The user should not have to login first, before he can unsubscribe. So the link has to be randomly generated for every user.</p> <h2>Unambiguous sender address</h2> <p>Thalia uses the address <code>info@produktnews.thalia.de</code> for sending product news. This is great, because I can create a filter that automatically deletes these emails. So although the unsubscribe-link doesn&#39;t work, I can get rid of this kind of spam without missing my order confirmations that get sent from <code>info@thalia.de</code> (that should be something like <code>confirmation@thalia.de</code>)</p> <p>Although Thalia has one address that is clearly only for product information, they didn&#39;t solve this problem. They also use <code>thalia@produktnews.thalia.de</code>, what makes it much more difficult for me to filter spam. But it&#39;s better than PayPal. They seem to use <code>paypal@e.paypal.de</code> which could have any content.</p> <h2>More ideas?</h2> <p>Does anybody have more ideas how companies could make online advertising, but avoid to spam people?</p> Microsoft product flavor hell http://martin-thoma.com/microsoft-product-flavor-hell Mon, 17 Dec 2012 12:05:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/microsoft-product-flavor-hell <p>As a KIT student I may download pretty much of Microsofts software from a MSDNAA-shop for free. So I&#39;ve downloaded Windows 7 and Visual Studio. I need them for work, so I thought it would be as simple as choosing to download it. But I didn&#39;t think of Microsofts will to make business at the expense of user experience.</p> <h2>Changing the language</h2> <p><strong>The Linux way</strong> If you want to change the language on a Linux (GNOME) system, you have to go to System &rarr; Administration &rarr; Language support</p> <p>You can choose from 140 languages for free, without any problems. However, most of them are only partially translated, but 28 are fully translated (<a href="http://askubuntu.com/a/229831/10425">source</a>). 10 minutes to search through the menus, 1 minute to change the language.</p> <p><strong>Now the Windows way:</strong> I don&#39;t know where I can change the language in Windows 7, so lets search in the settings.</p> <p>[10 minutes pass]</p> <p>Well, lets google for the right way to achieve a simple language change: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/12/google-search-language-change.png"><img src="../images/2012/12/google-search-language-change.png" alt="" width="512" height="400" class="size-full wp-image-50661"/></a><p class="wp-caption-text"></p></div></p> <p>So, it seems as if I needed Windows 7 Ultimate or Windows 7 Enterprise edition. Which version do I have? Let&#39;s search ... hm, seeems as there are some versions: <div style="width: 510px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-7-editions.jpg"><img src="../images/2012/12/windows-7-editions.jpg" alt="" width="510" height="510" class="size-full wp-image-50681"/></a><p class="wp-caption-text"></p></div></p> <p>And also <a href="../images/2012/12/windows-7-enterprise.jpg"><img src="../images/2012/12/windows-7-enterprise-300x295.jpg" alt="" title="Windows 7 enterprise edition" width="300" height="295" class="aligncenter size-medium wp-image-50691" /></a> and Windows 7 Starter, Windows 7 Home Basic. Did I already mention the family pack? It&#39;s so complicated ... there is even a Wikipedia page about <a href="http://en.wikipedia.org/wiki/Windows_7_editions">Windows 7 editions</a>!</p> <p>Find out which version I have (another 15 minutes of searching how to do so): <div style="width: 432px" class="wp-caption aligncenter"><a href="../images/2012/12/winver-search.png"><img src="../images/2012/12/winver-search.png" alt="" width="432" height="573" class="size-full wp-image-50641"/></a><p class="wp-caption-text"></p></div></p> <p>And finally: <div style="width: 474px" class="wp-caption aligncenter"><a href="../images/2012/12/winver.png"><img src="../images/2012/12/winver.png" alt="" width="474" height="412" class="size-full wp-image-50651"/></a><p class="wp-caption-text"></p></div></p> <p>Aaaaargh! I don&#39;t have the right edition to be able to change my language to English. I have to reinstall the whole system to get it in English!</p> <p>Well, but as there are so many different editions, there have to be some differences. Lets see if I can find them. [5 minutes later] Oh, Microsoft offers some nice-looking information at <a href="http://windows.microsoft.com/en-US/windows7/products/compare">windows.microsoft.com</a>:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/windows-7-editions-differences-300x152.png"><img src="../images/2012/12/windows-7-editions-differences-300x152.png" alt="" width="300" height="152" class="size-medium wp-image-50731"/></a><p class="wp-caption-text"></p></div> <p>What the #`$@&amp;%*!? Why do they write down similarities? I don&#39;t want to know what&#39;s the same, I want to know the difference! And even the similarities are meaningless. For example <blockquote>Start programs faster and more easily, and quickly find the documents you use most often.</blockquote> If you use comparisons as &quot;faster&quot; or &quot;more easily&quot; you have to say what you compare. Faster than Vista? Faster than DOS? Faster than Linux? All of those lines are meaningless marketing slang that does not offer any useful peace of information and only wastes time.</p> <p>Result: I have wasted about one hour later, I know that I can&#39;t get my system in English without reinstalling it. I have to waste another hour to download it and even one more hour to reinstall it. Linux vs. Windows: 11 minutes of work, nothing to pay vs. 3 hours of work (I got it for free, as I am a student. Otherwise, I might have had to pay about $`150).</p> <h2>Visual Studio</h2> <p>The team I am working with created a diagram on one developers machine. After he had to go, we wanted to continue on another developers machine. So we saved the version and opened it on the other machine. So far so good. After a while we noticed, that we were not able to edit the content of the diagram! The first developer had Visual Studio 2012 Ultimate, the second one &quot;only&quot; Visual Studio 2012 Professional. The difference is obvious, isn&#39;t it? NO, IT IS NOT!</p> <p>Finally, a little story. Some weeks ago, a prof had some problems showing his slides that were made with Microsoft PowerPoint. The bulled points were showing, but not the text. A friend of mine said: &quot;The source of this problem is obvious. He certainly does not have PowerPoint Ultimate&quot; :-)</p> <h2>TL;DR</h2> <p>Microsoft creates a lot of different editions for their software. &quot;Ultimate&quot; seems to be always the best. Microsoft makes things too complicated, without any reason to do so. This video shows what I mean:</p> <iframe width="512" height="384" src="http://www.youtube.com/embed/G9HfdSp2E2A" frameborder="0" allowfullscreen></iframe> <p>I don&#39;t understand why a company with that much money, great developers and a lot of user feedback is not able to produce satisfactory, working software.</p> Creating Gantt Charts http://martin-thoma.com/creating-gantt-charts Wed, 12 Dec 2012 23:02:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/creating-gantt-charts <p>I am currently involved in a software project and I should create a Gantt chart. So I&#39;ve searched for tools that allow me to do so, but it was astonishingly difficult to find good tools. I&#39;m not completely content with any of them, but I would like to share my experiences.</p> <h2>Gantter</h2> <h3>Overview</h3> <p><a href="https://app.gantter.com">Gantter</a> is a free online tool that allows you to create Gantt charts.</p> <p>It looks like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/gantter-overview-300x138.png"><img src="../images/2012/12/gantter-overview-300x138.png" alt="" width="300" height="138" class="size-medium wp-image-50231"/></a><p class="wp-caption-text"></p></div></p> <p>It is easy to use and has a good interface. I can simply define depencies:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/gantter-predecessor-depenency-300x138.png"><img src="../images/2012/12/gantter-predecessor-depenency-300x138.png" alt="" width="300" height="138" class="size-medium wp-image-51101"/></a><p class="wp-caption-text"></p></div> <h3>Export</h3> <p>Gantter offers some export options: HTML, <a href="../pdf/UpToDatE-Implementierung.pdf">PDF</a>, <a href="../images/2012/12/UpToDatE-Implementierung.png">PNG</a>, MS-Project (.xml). All export options I&#39;ve tried are unconvincing. I couldn&#39;t save the HTML export, the PDF export was splitted over several pages and the PNG ... well, it&#39;s a PNG. As I am currently on a Linux machine, I can&#39;t try the MS-Project export.</p> <h3>Google Drive</h3> <p>Gantter also has a Google Drive integration, but it requests these permissions: <div style="width: 470px" class="wp-caption aligncenter"><a href="../images/2012/12/gantter-google-drive-files.png"><img src="../images/2012/12/gantter-google-drive-files.png" alt="" width="470" height="471" class="size-full wp-image-50241"/></a><p class="wp-caption-text"></p></div></p> <p>I have contacted them today (11.12.2012) and asked why they want these permissions. I&#39;ll update this post as soon as I get an answer.</p> <p>My recommendation: Don&#39;t give them those rights! You can create an account without a Google Drive permission.</p> <h2>GanttProject</h2> <p><a href="http://www.ganttproject.biz/">GanttProject</a> is a Java Gantt chart program (as you might have noticed because of the SWING design):</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/GanttProject-300x201.png"><img src="../images/2012/12/GanttProject-300x201.png" alt="" width="300" height="201" class="size-medium wp-image-50361"/></a><p class="wp-caption-text"></p></div> <p>It&#39;s quite good, but sometimes I got the feeling that it doesn&#39;t instantly response. It&#39;s perhaps imagination as I always think that of Java projects.</p> <p>The HTML-export is not so good. It basically converts the chart to an image and embeds this into a HTML page. This is not what I thought of! This way, you can&#39;t search or copy the tasks. You also can&#39;t see more information about the task.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/GanttProject-export-300x80.png"><img src="../images/2012/12/GanttProject-export-300x80.png" alt="" width="300" height="80" class="size-medium wp-image-50371"/></a><p class="wp-caption-text"></p></div> <h2>GNOME Planner</h2> <p><a href="https://live.gnome.org/Planner">Planner</a> is part of GNOME.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/Planner-300x157.png"><img src="../images/2012/12/Planner-300x157.png" alt="" width="300" height="157" class="size-medium wp-image-50291"/></a><p class="wp-caption-text"></p></div> <p>This is how you create a new task: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/Planner-new-task-300x275.png"><img src="../images/2012/12/Planner-new-task-300x275.png" alt="" width="300" height="275" class="size-medium wp-image-50381"/></a><p class="wp-caption-text"></p></div></p> <p>It is very annoying that you always have to click on &quot;Change&quot;, then on &quot;As soon as possible&quot; change it to &quot;fixed date&quot; and then you can click on a date. Why don&#39;t you allow the user to click on a date and when he does, change it automatically to &quot;fixed date&quot;?</p> <p>The HTML-export is good, but I would also like to click on a tasks&#39; bar and get the associated task highlighted (and perhaps some additional information).</p> <h2>Trac jsGantt plugin</h2> <p>You can let Trac automatically create a Gantt chart with <a href="http://trac-hacks.org/wiki/TracJsGanttPlugin">Trac jsGantt plugin</a>. According to this link, it should look like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/jsGanttSample-300x150.png"><img src="../images/2012/12/jsGanttSample-300x150.png" alt="" width="300" height="150" class="size-medium wp-image-50511"/></a><p class="wp-caption-text"></p></div> <p>I knew that I had to install the <a href="http://trac-hacks.org/wiki/MasterTicketsPlugin">MasterTicketsPlugin</a> to make it possible to add ticket dependencies. With that, it looked like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/jsGantt-without-plugins-300x205.png"><img src="../images/2012/12/jsGantt-without-plugins-300x205.png" alt="" width="300" height="205" class="size-medium wp-image-50521"/></a><p class="wp-caption-text"></p></div> <p>Not quite what I&#39;ve expected. So I guess I will also need <a href="http://trac-hacks.org/wiki/SubticketsPlugin">SubticketsPlugin</a> and <a href="http://trac-hacks.org/wiki/TimingAndEstimationPlugin">TimingAndEstimationPlugin</a>.</p> <p>Update: These Trac-Plugins are crap. The Gantt-Chart that was created looks ugly and doesn&#39;t look like I&#39;ve expected.</p> <h2>LaTeX</h2> <h3>pgfgantt</h3> <p>This piece of LaTeX:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="na">[pdftex,active,tightpage]</span><span class="nb">{</span>preview<span class="nb">}</span> <span class="k">\setlength\PreviewBorder</span><span class="nb">{</span>2mm<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>pgfgantt<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>preview<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>ganttchart<span class="nb">}{</span>12<span class="nb">}</span> <span class="k">\gantttitle</span><span class="nb">{</span>2012<span class="nb">}{</span>12<span class="nb">}</span> <span class="k">\\</span> <span class="k">\gantttitlelist</span><span class="nb">{</span>1,...,12<span class="nb">}{</span>1<span class="nb">}</span> <span class="k">\\</span> <span class="k">\ganttgroup</span><span class="nb">{</span>Group 1<span class="nb">}{</span>1<span class="nb">}{</span>7<span class="nb">}</span> <span class="k">\\</span> <span class="k">\ganttbar</span><span class="nb">{</span>Task 1<span class="nb">}{</span>1<span class="nb">}{</span>2<span class="nb">}</span> <span class="k">\\</span> <span class="k">\ganttlinkedbar</span><span class="nb">{</span>Task 2<span class="nb">}{</span>3<span class="nb">}{</span>7<span class="nb">}</span> <span class="k">\ganttnewline</span> <span class="k">\ganttmilestone</span><span class="nb">{</span>Milestone<span class="nb">}{</span>7<span class="nb">}</span> <span class="k">\ganttnewline</span> <span class="k">\ganttbar</span><span class="nb">{</span>Final Task<span class="nb">}{</span>8<span class="nb">}{</span>12<span class="nb">}</span> <span class="k">\ganttlink</span><span class="nb">{</span>elem2<span class="nb">}{</span>elem3<span class="nb">}</span> <span class="k">\ganttlink</span><span class="nb">{</span>elem3<span class="nb">}{</span>elem4<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>ganttchart<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>preview<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <p>generates this Gantt chart:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/12/gantt-pgf.png"><img src="../images/2012/12/gantt-pgf.png" alt="" width="500" height="447" class="size-full wp-image-50541"/></a><p class="wp-caption-text"></p></div> <p>Source is <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents/gantt-pgf">here</a>.</p> <h3>Another LaTeX Gantt chart solution</h3> <p>This source: ```latex \documentclass{article} \usepackage[pdftex,active,tightpage]{preview} \setlength\PreviewBorder{2mm} \usepackage{gantt}</p> <p>\begin{document} \begin{preview} \begin{gantt}{10}{12} \begin{ganttitle} \numtitle{1}{1}{12}{1} \end{ganttitle} \ganttbar{a task}{0}{2} \ganttbarcon{a consecutive task}{2}{4} \ganttbarcon{another consecutive task}{8}{2} \ganttmilestone[color=cyan]{Milestone with color!}{4} \ganttbar{another task}{2}{2} \ganttbar[color=cyan]{another coloured task}{4}{4} \ganttbar{another task}{4}{2} \ganttcon{4}{5}{4}{7} \ganttmilestonecon{A connected Milestone}{7} \ganttbarcon{another consecutive task}{8}{2} \end{gantt} \end{preview} \end{document} ```</p> <p>creates</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/12/gantt.png"><img src="../images/2012/12/gantt.png" alt="" width="500" height="240" class="size-full wp-image-50551"/></a><p class="wp-caption-text"></p></div> <p>Full source is <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents/gantt">here</a>.</p> <p>Although the result looks very nice, I don&#39;t think LaTeX is an optimal solution for Gantt charts of software projects. Yes, you get a great result. But it takes a lot of time and after a week or so this particular chart is definitely outdated. You can&#39;t add more information directly as you could do it with HTML tooltips. I don&#39;t know if you can produce a linked PDF, but I guess this would be quite a lot of manual work. </p> <h2>More tools</h2> <p><a href="http://www.projectlibre.org/">ProjectLibre</a> was recommended to me, but it is not in the Ubuntu repository :-(</p> <h2>Conclusion</h2> <p>LaTeX rulez. If you want nice looking results, you should definitely use LaTeX. Although I think combining an automatically generated Gantt-chart with tickes would be nice, this seems not to be possible by now.</p> 31. BwInf - Runde 1, Aufgabe 2 http://martin-thoma.com/31-bwinf-runde-1-aufgabe-2 Wed, 12 Dec 2012 11:12:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/31-bwinf-runde-1-aufgabe-2 <h2>Die Aufgabenstellung</h2> <blockquote>Zum Transport von Geld werden schwer bewachte Geldtransporter eingesetzt. In einem solchen Geldtransporter k&ouml;nnen Koffer mit M&uuml;nzen transportiert werden. Die Koffer enthalten M&uuml;nzen in unterschiedlicher Menge und mit unterschiedlichem Gesamtwert. Entsprechend unterscheiden sich die Koffer in Gewicht und Wert. Da kommt so einiges an Gewicht zusammen. Es ist daher notwendig, den Transporter gleichm&auml;&szlig;ig zu beladen, so dass er nicht zu einer Seite umkippen kann. Unser Transporter hat links und rechts je einen Kofferraum. F&uuml;r jeden Kofferraum lassen sich Gesamtwert und Gesamtgewicht der darin enthaltenen Koffer bestimmen. Damit der Transporter keine Schlagseite bekommt, m&uuml;ssen die Koffer so einger&auml;umt werden, dass die Differenz zwischen den beiden Gesamtgewichten minimal ist. Aus versicherungstechnischen Gr&uuml;nden d&uuml;rfen die beiden Gesamtwerte sich au&szlig;erdem um h&ouml;chstens 10.000 Euro unterscheiden.</blockquote> <blockquote>Schreibe ein Programm zur Verteilung der Geldkoffer auf die beiden Kofferr&auml;ume. &Uuml;berpr&uuml;fe dein Programm mit den auf <a href="http://www.bundeswettbewerb-informatik.de/index.php?id=1168">www.bundeswettbewerb-informatik.de</a> abgelegten Beispielen mit Angaben zu Werten und Gewichten der einzelnen Koffer.</blockquote> <p>Quelle: <a href="http://www.bundeswettbewerb-informatik.de/fileadmin/templates/bwinf/aufgaben/bwinf31/Aufgabenblatt311_Aufgaben.pdf">www.bundeswettbewerb-informatik.de</a></p> <h2>Vollst&auml;ndiger Pseudocode</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/12/pseudocode-31.1.2-bwinf.png"><img src="../images/2012/12/pseudocode-31.1.2-bwinf.png" alt="" width="512" height="412" class="size-full wp-image-46861"/></a><p class="wp-caption-text"></p></div> <h2>L&ouml;sung mit GLPK</h2> <p>Der folgende Code muss als partition.mod gespeichert werden:</p> <div class="highlight"><pre><code class="text">/* PARTITION */ /* Written in GNU MathProg by Martin Thoma &lt;info@martin-thoma.de&gt; */ /* Given a set of items I = {1,...,m} with weight w[i] &gt; 0, the PARTITION problem is to split the set of items into two sets such that the absolute value of the difference of the sum of weights of the two sets is minimal */ param m, integer, &gt; 0; /* number of items */ set I := 1..m; /* set of items */ param w{i in 1..m}, &gt; 0; /* w[i] is weight of item i */ param v{i in 1..m}, &gt; 0; /* v[i] is value of item i */ param c, &gt; 0; /* maximum value difference */ param z{i in I, j in 1..m} := /* z[i,j] = 1 if item i is in bin j, otherwise z[i,j] = 0 */ if i = 1 and j = 1 then 1 /* put item 1 into bin 1 */ else if exists{jj in 1..j-1} z[i,jj] then 0 /* if item i is already in some bin, do not put it into bin j */ else if sum{ii in 1..i-1} w[ii] * z[ii,j] + w[i] &gt; c then 0 /* if item i does not fit into bin j, do not put it into bin j */ else 1; /* otherwise put item i into bin j */ check{i in I}: sum{j in 1..2} z[i,j] = 1; /* each item must be exactly in one bin */ param n := 2; display n; set J := 1..n; /* set of bins */ var x{i in I, j in J}, binary; /* x[i,j] = 1 means item i is in bin j */ s.t. one{i in I}: sum{j in J} x[i,j] = 1; /* each item must be exactly in one bin */ /* analog zu http://lists.gnu.org/archive/html/help-glpk/2007-08/msg00036.html */ s.t. lim1{j in J}: (sum{i in I} v[i] * x[i,1]) - (sum{i in I} v[i] * x[i,2]) &lt;= c; s.t. lim2{j in J}: (sum{i in I} v[i] * x[i,2]) - (sum{i in I} v[i] * x[i,1]) &lt;= c; /* the difference of the values may not be more than 10000 */ s.t. lim3{j in J}: (sum{i in I} w[i] * x[i,1]) - (sum{i in I} w[i] * x[i,2]) &gt;= 0; minimize obj: (sum{i in I} w[i] * x[i,1]) - (sum{i in I} w[i] * x[i,2]); /* No abs because of linearity: http://old.nabble.com/How-to-get-a-variable&#39;s-absolute-value-with-GNU-mathprog-tt22241565.html*/ /* objective is to minimize the difference of weights */ data; /* The optimal solution is 3 bins */ /*param m := 15; param v := 1 96000, 2 126000, 3 115000, 4 125000, 5 123000, 6 123000, 7 112000, 8 111000, 9 110000, 10 110000, 11 120000, 12 98000, 13 130000, 14 87000, 15 97000; param w := 1 27, 2 21, 3 27, 4 15, 5 19, 6 46, 7 47, 8 32, 9 14, 10 20, 11 50, 12 19, 13 22, 14 50, 15 46; param m := 20; param w := 1 27, 2 50, 3 19, 4 19, 5 22, 6 79, 7 32, 8 19, 9 75, 10 32, 11 43, 12 82, 13 18, 14 24, 15 20, 16 30, 17 24, 18 80, 19 49, 20 15; param v := 1 276000, 2 745000, 3 585000, 4 585000, 5 723000, 6 808000, 7 552000, 8 584000, 9 626000, 10 551000, 11 423000, 12 944000, 13 496000, 14 133000, 15 633000, 16 461000, 17 813000, 18 855000, 19 695000, 20 406000; param m := 30; param w := 1 103, 2 100, 3 95, 4 119, 5 148, 6 165, 7 721, 8 89, 9 89, 10 156, 11 181, 12 93, 13 239, 14 173, 15 87, 16 113, 17 1816, 18 107, 19 128, 20 102, 21 102, 22 115, 23 118, 24 124, 25 244, 26 394, 27 100, 28 92, 29 103, 30 126; param v := 1 42000, 2 31000, 3 20000, 4 20000, 5 20000, 6 20000, 7 180000, 8 9000, 9 9000, 10 18000, 11 18000, 12 28000, 13 28000, 14 17000, 15 121000, 16 14000, 17 579000, 18 13000, 19 13000, 20 12000, 21 12000, 22 12000, 23 12000, 24 12000, 25 33000, 26 65000, 27 22000, 28 11000, 29 11000, 30 11000; */ param m := 40; param w := 1 3512, 2 87, 3 87, 4 90, 5 91, 6 91, 7 99, 8 218, 9 89, 10 91, 11 91, 12 92, 13 92, 14 93, 15 95, 16 99, 17 100, 18 263, 19 88, 20 89, 21 91, 22 92, 23 93, 24 97, 25 99, 26 99, 27 90, 28 97, 29 399, 30 298, 31 160, 32 854, 33 132, 34 986, 35 255, 36 88, 37 89, 38 92, 39 97, 40 98; param v := 1 672000, 2 10000, 3 10000, 4 10000, 5 10000, 6 10000, 7 10000, 8 244000, 9 73000, 10 9000, 11 9000, 12 9000, 13 9000, 14 9000, 15 9000, 16 9000, 17 9000, 18 83000, 19 8000, 20 8000, 21 8000, 22 8000, 23 8000, 24 8000, 25 8000, 26 8000, 27 7000, 28 7000, 29 103000, 30 144000, 31 58000, 32 399000, 33 15000, 34 472000, 35 120000, 36 12000, 37 12000, 38 11000, 39 11000, 40 11000; param c := 10000; end; </code></pre></div> <p>Jetzt muss man folgendes ausf&uuml;hren:</p> <div class="highlight"><pre><code class="bash">glpsol --output example.out --log example.log --math partition.mod </code></pre></div> <p>Das ben&ouml;tigt f&uuml;r die gr&ouml;&szlig;te Eingabe etwa 18 Sekunden.</p> <p>Wenn man nun in die example.out schaut, sieht man unter anderem folgendes:</p> <div class="highlight"><pre><code class="text">Problem: partition Rows: 47 Columns: 80 (80 integer, 80 binary) Non-zeros: 640 Status: INTEGER OPTIMAL Objective: obj = 5 (MINimum) </code></pre></div> <p>Die interessante Zahl ist die 5. Das ist das Minimum, das in dieser Aufgabe gesucht war. Wie es zu erreichen ist, sieht man in der Ausgabe darunter.</p> <h2>Weiteres</h2> <p>Man kann das Problem auch als MULTIPROCESSOR SCHEDULING mit zwei Maschinen betrachten (und nicht als PARTITION). Vor ein paar Tagen habe ich gelernt, dass es f&uuml;r MULTIPROCESSOR SCHEDULING auch ein <a href="http://de.wikipedia.org/wiki/Approximationsalgorithmus#PTAS.2FPAS">PAS</a> gibt. Dabei bestimmt man f&uuml;r eine konstante Anzahl an Koffern die optimale aufteilung und verteilt den rest mittels LIST SCHEDULING.</p> How can I clear gedit text search / replace history? http://martin-thoma.com/how-can-i-clear-gedit-text-search-replace-history Sat, 08 Dec 2012 12:48:28 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-can-i-clear-gedit-text-search-replace-history <p>Start <code>gconf-editor</code>:</p> <div class="highlight"><pre><code class="bash">gconf-editor </code></pre></div> <p>Go to <code>/apps/gnome-settings/gedit/history-gedit2<em>search</em>for<em>entry</code> and <code>/apps/gnome-settings/gedit/history-gedit2</em>replace<em>entry</em>with</code> and remove the content there:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/12/gedit-remove-text-search-history.png"><img src="../images/2012/12/gedit-remove-text-search-history.png" alt="" width="512" height="392" class="size-full wp-image-50181"/></a><p class="wp-caption-text"></p></div> TOP 5: Worst Website Designs http://martin-thoma.com/top-5-worst-website-designs Fri, 07 Dec 2012 07:27:28 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/top-5-worst-website-designs <p>Here are some screenshots of the worst websites I have ever seen. Most of them use too many colors, something moves or the background is black. One uses frames.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/dokimos-300x210.png"><img src="../images/2012/12/dokimos-300x210.png" alt="" width="300" height="210" class="size-medium wp-image-50041"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/fabricland.co_.uk_-300x214.png"><img src="../images/2012/12/fabricland.co_.uk_-300x214.png" alt="" width="300" height="214" class="size-medium wp-image-50051"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/coolmath-games-300x214.png"><img src="../images/2012/12/coolmath-games-300x214.png" alt="" width="300" height="214" class="size-medium wp-image-50031"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/ronoslund-300x214.png"><img src="../images/2012/12/ronoslund-300x214.png" alt="" width="300" height="214" class="size-medium wp-image-50061"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/12/5safepoints-300x214.png"><img src="../images/2012/12/5safepoints-300x214.png" alt="" width="300" height="214" class="size-medium wp-image-50071"/></a><p class="wp-caption-text"></p></div> <p>Do you know similar examples for bad website designs (Spambots might have a higher success rate for useful comments now. I&#39;ll have to check that ;-) )</p> Wie zeige ich Differenzierbarkeit? http://martin-thoma.com/wie-zeige-ich-differenzierbarkeit Wed, 05 Dec 2012 10:59:08 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-zeige-ich-differenzierbarkeit <p>Weil das Thema so wichtig ist und man es doch recht leicht vergisst:</p> <div class="definition">Sei `$I \subseteq \mathbb{R}$` ein Intervall und `$f:I \rightarrow \mathbb{R}$` eine Funktion. <ol> <li>`$f$` hei&szlig;t in `$x_0 \in I$` <strong>differenzierbar</strong> `$\displaystyle :\Leftrightarrow \lim_{x \rightarrow x_0} \frac{f(x) - f(x_0)}{x-x_0}$` existiert und ist in `$\mathbb{R}$`.<br/> In diesem Fall hei&szlig;t `$\displaystyle f'(x_0) = \lim_{x \rightarrow x_0} \frac{f(x) - f(x_0)}{x-x_0}$` die <strong>Ableitung von `$f$` in `$x_0$`</strong>.</li> <li>`$f$` hei&szlig;t auf `$I$` differenzierbar `$:\Leftrightarrow \forall x \in I: f \text{ ist in } x$` differenzierbar.<br/> In diesem Fall wird durch `$x \mapsto f'(x)$` eine Funktion `$f':I \rightarrow \mathbb{R}$` definiert, die <strong>Ableitung</strong> von `$f$` auf `$I$`.</li> </ol> </div> <p>Und wie zeigt man die Existenz dieses Grenzwertes? Das ist eine andere Frage :-P Man sollte sich vielleicht nochmal den Artikel <a href="../konvergenz-von-folgen/">Konvergenz von Folgen</a> bzw. <a href="../konvergenz-von-reihen/">Konvergenz von Reihen</a> anschauen.</p> <p>Ach ja, man kann auch zeigen, dass <code>$\displaystyle \lim_{h \rightarrow 0} \frac{f(x_0+h)-f(x_0)}{h}$</code> existiert und in <code>$\mathbb{R}$</code> ist. Das ist &auml;quivalent.</p> Reflecting a point over a line http://martin-thoma.com/reflecting-a-point-over-a-line Sun, 02 Dec 2012 14:32:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/reflecting-a-point-over-a-line <p>It&#39;s astonishing how difficult it is to find a good explanation how to reflect a point over a line that does not use higher math methods. So here is my explanation:</p> <p>You have a point <code>$P = (x,y)$</code> and a line <code>$g(x) = m \cdot x + t$</code> and you want to get the point <code>$P&#39; = (x&#39;, y&#39;)$</code> that got mirrored over <code>$g$</code>.</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/12/line-reflection.png"><img src="../images/2012/12/line-reflection.png" alt="" width="500" height="596" class="size-full wp-image-49811"/></a><p class="wp-caption-text"></p></div> <p>As you can see, you can construct this quite easily on paper: <ol> <li>Construct the perpendicular through <code>$P$</code> to <code>$g$</code>. It starts in <code>$L$</code> and ends in <code>$P$</code>.</li> <li>Double the length of the perpendicular in the direction of <code>$L$</code>.</li> <li>The endpoint is <code>$P&#39;$</code>.</li> </ol></p> <p>How can you do that without drawing it? </p> <p>First you have to get the perpendicular <code>$s(x) = m_s \cdot x + t$</code> (the dashed red line). </p> <p>You have to know this: <code>$m_s = - \frac{1}{m}$</code> And then you know that <code>$P$</code> is on <code>$s$</code>. So you simply put in the values <code>$x,y$</code> of P and solve to <code>$t$</code>: <code>$t = y - m_s \cdot x$</code></p> <p>Now you have <code>$s$</code>. As <code>$s$</code> and <code>$g$</code> have exactly point in common, the following equation gives exactly one result:</p> <p><code>$s(x) = g(x)$</code></p> <p>You have to solve for <code>$x$</code>. Then you only need to put <code>$x$</code> into <code>$s(x)$</code> or <code>$g(x)$</code> and you&#39;re done. You&#39;ve calculated <code>$L = (x,y)$</code>.</p> <p>Now you know <code>$\Delta x = |x_L - x_P|$</code> and <code>$\Delta y = |y_L - y_P|$</code> and you can calculate <code>$P&#39;$</code></p> Profiling C programs http://martin-thoma.com/profiling-c-programs Sat, 01 Dec 2012 16:00:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/profiling-c-programs <p>If you have a working program and you want to improve its execution speed, you might want to profile it. An easy way to do so, is adding global variables, increasing them at interesting points and counting how often these points are executed. A more sophisticated way is using a profiler.</p> <h2>valgrind and kcachegrind</h2> <p>Install valgrind and kcachegrind. For Ubuntu users:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install valgrind kcachegrind </code></pre></div> <p>Create a profile:</p> <div class="highlight"><pre><code class="bash">valgrind --tool<span class="o">=</span>callgrind ./connectfour </code></pre></div> <p>(I&#39;ve profiled a connect four application. Replace that with your application) This command will create a file called similar to &quot;callgrind.out.4846&quot;.</p> <p>Take a look at the profile:</p> <div class="highlight"><pre><code class="bash">kcachegrind callgrind.out.4846 </code></pre></div> <p>You can also create a call-graph: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/11/call-graph2.png"><img src="../images/2012/11/call-graph2.png" alt="" width="512" height="601" class="size-full wp-image-49691"/></a><p class="wp-caption-text"></p></div></p> <p>Just take a look at it by yourself. You will see much more than I could tell you now.</p> Debugging a C program http://martin-thoma.com/debugging-a-c-program Fri, 30 Nov 2012 16:00:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/debugging-a-c-program <p>As I began with programming C, I had enormous difficulties to produce working code. Most of the time it didn&#39;t even compile, but when it compiled and I got a runtime error, I basically read my whole code again. I <strike>didn&#39;t</strike> don&#39;t know any good online resource for C, so I&#39;ve always searched with Google for answers to questions that I couldn&#39;t properly formulate. One question that is important for beginners is <a href="http://stackoverflow.com/q/12949290/562769">How do I find missing C header files (without Internet)?</a> and another one might be: How can I debug my programs?</p> <h2>Compile time vs. runtime</h2> <p>A typical C workflow looks like this: You have an idea, you write your code, you compile it and you run it. <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/11/c-workflow.png"><img src="../images/2012/11/c-workflow.png" alt="" width="512" height="229" class="size-full wp-image-49641"/></a><p class="wp-caption-text"></p></div></p> <p>You might make multiple errors. Simple typos or syntax errors are almost always detected at compile time. They are called &quot;compile time errors&quot;. Others, like the access of an array-index that isn&#39;t in the array might only occur sometimes at runtime, depending on the input. Those are runtime errors and they are much more difficult to detect. Additionally, they can not be reproduced that easily as compile time errors can.</p> <h2>gdb</h2> <p>If you want to find runtime errors, you should deactivate all optimization flags and add debugging symbols. A gcc call might look like this:</p> <div class="highlight"><pre><code class="bash">gcc mySourceFile.c -g </code></pre></div> <p>This produces a binary file called &quot;a.out&quot;.</p> <p>Now should run gdb - GNU debug:</p> <div class="highlight"><pre><code class="bash">gdb ./a.out </code></pre></div> <p>Within the command line program GNU debug you have to enter:</p> <div class="highlight"><pre><code class="bash">run ./a.out </code></pre></div> <p>You should now be able to see the line in which the runtime-error occurs.</p> <h2>valgrind</h2> <p>You might want to give valgrind a try.</p> <p><em>Uninitialised value was created by a stack allocation at 0x80488BC</em>: This could mean that you used an uninitialized variable. Check your variable initializations from the given point. Add <code>--track-origins=yes&lt;/code and run valgrind again.</p> Make your Bash more useful http://martin-thoma.com/make-your-bash-more-useful Thu, 29 Nov 2012 10:15:56 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/make-your-bash-more-useful <p>I just had the problem, that the bash prompt of my universities computer I&#39;ve connected to via SSH looked like this: <code>bash-4.0</code>$`</p> <h2>Change the prompt</h2> <p>I think it&#39;s much more useful to see the path you&#39;re currently using. To get the current path in your bash promt, you have to add the following snippet to your <code>.bashrc</code>:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash"><span class="c"># This will limit the path to 30 characters.</span> <span class="nv">PROMPT_COMMAND</span><span class="o">=</span><span class="s1">&#39;if [ $`{#PWD} -gt 30 ]; then </span> <span class="s1">myPWD=`${PWD:0:12}...</span> <span class="s1">$`{PWD:`${#PWD}-15}; else myPWD=$`PWD; fi&#39;</span> <span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;\u@\h \`$myPWD$` &quot;</span> </code></pre></div> <p>(Source: <a href="http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html">cyberciti.biz</a>)</p> <p>Reload your bash config with <code>source .bashrc</code> and you should instantly see the changes.</p> <h2>Aliases</h2> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash"><span class="c"># Add color to ls</span> <span class="nb">alias </span><span class="nv">ls</span><span class="o">=</span><span class="s2">&quot;ls --color&quot;</span> </code></pre></div><div class="highlight"><pre><code class="bash language-bash" data-lang="bash"><span class="c"># simply update an svn-repository</span> <span class="nb">alias </span><span class="nv">swt</span><span class="o">=</span><span class="s1">&#39;svn up /home/moose/Studium/SWT&#39;</span> </code></pre></div> Karlsruhe: Oberbürgermeisterwahl 2012 http://martin-thoma.com/karlsruhe-oberburgermeisterwahl-2012 Tue, 27 Nov 2012 13:17:39 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/karlsruhe-oberburgermeisterwahl-2012 <p>Da ich mein Erstwohnsitz inzwischen Karlsruhe ist, darf ich hier w&auml;hlen. Am Sonntag, den 2. Dezember 2012 ist die Wahl des Oberb&uuml;rgermeisters in Karlsruhe. Seit 1970 wird dieses Amt von einem CDU&#39;ler besetzt.<small><sup><a href="#ref1" name="anchor1">[1]</a></sup></small> <a href="http://de.wikipedia.org/wiki/Heinz_Fenrich">Heinz Fenrich</a> (CDU) ist seit 1998 im Amt, hat aber die Altersgrenze erreicht und kann somit nicht wieder gew&auml;hlt werden.</p> <h2>Die Kandidaten</h2> <p>Die UStA hat den 7 Kandidaten einige Fragen gestellt und kurze Informationen bereitgestellt (<a href="http://www.usta.de/wiki/buergermeisterwahl2012">Link</a> - Vielen Dank daf&uuml;r!). </p> <p>Hier mal das Interessanteste:</p> <h3>Dr. Frank Mentrup, SPD-Gr&uuml;ne-KAL</h3> <table class="wikitable"> <tr><td>Alter</td><td>48 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>seit 2007</td></tr> <tr><td>Beruf</td><td>Arzt f&uuml;r Kinder- und Jugendpsychiatrie</td></tr> <tr><td>Politik</td><td>viel, vgl. Wikipedia<br/>2011: Staatssekret&auml;r im Ministerium f&uuml;r Kultus, Jugend und Sport</td></tr> <tr><td>Wikipedia</td><td><a href="http://de.wikipedia.org/wiki/Frank_Mentrup">Link</a></td></tr> </table> <p>Ziele und Aussagen: <ul> <li><strong>Wohnraummangel</strong>: &bdquo;[...] werde ich ein kommunales Wohnraumf&ouml;rderungsprogramm f&uuml;r Karlsruhe erarbeiten&ldquo;</li> <li><strong>Studiticket</strong>: viel bla bla, durchaus gute und vern&uuml;nftige Begr&uuml;ndungen, aber in kurz: An den Preisen f&uuml;r das Studiticket kann der OB nichts machen</li> <li><strong>Rad vs. Baustellen</strong>: &bdquo;Der weitere Ausbau von Radwegen, insbesondere auch auf studentischen Routen wie z.B. zwischen Wohnheimen und den Hochschulen muss z&uuml;gig erfolgen.&ldquo;</li> <li><strong>Slacklinen</strong>: &bdquo;[ich werde] mich f&uuml;r die Einrichtung von Slacklineanlagen einsetzen.&ldquo;</li> <li><strong>Sonstiges</strong>: Als Oberb&uuml;rgermeister werde ich eine ausgewogene Stadtentwicklungspolitik verfolgen, die Karlsruhe zu einer gr&uuml;nen Stadt machen wird mit einem durchgehenden Gr&uuml;nstreifen vom Rhein bis in die Bergd&ouml;rfer.</li> </ul></p> <p>Insgesamt erwecken Mentrup einen soliden Eindruck. Die Antworten scheinen durchdacht zu sein und er spricht einige Projekte / Initiativen an, die es bereits gibt. Er scheint also mit der Politik der Stadt vertraut zu sein.</p> <h3>Ingo Wellenreuther, CDU</h3> <table class="wikitable"> <tr><td>Alter</td><td>52 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>geboren</td></tr> <tr><td>Beruf</td><td>11 Jahre Richter am Landgericht und Oberlandgericht</td></tr> <tr><td>Politik</td><td>viel, vgl. Wikipedia<br/>seit &uuml;ber 10 Jahren Bundestagsabgeordneter<br/>seit dreizehn Jahren im Stadtrat</td></tr> <tr><td>Wikipedia</td><td><a href="http://de.wikipedia.org/wiki/Ingo_Wellenreuther">Link</a></td></tr> </table> <p>Ziele und Aussagen: <ul> <li><strong>Wohnraummangel</strong>: &bdquo;[ich will] gezielt auf die Umlandgemeinden zugehen, [...] damit auch diese Wohnraum f&uuml;r Studenten schaffen&ldquo;</li> <li><strong>Studiticket</strong>: &bdquo;Als Oberb&uuml;rgermeister w&uuml;rde ich mich f&uuml;r ein studierendenfreundliches Ergebnis stark machen.&ldquo;</li> <li><strong>Rad vs. Baustellen</strong>: Sehr viel blah blah</li> <li><strong>Slacklinen</strong>: &bdquo;[ich werde] mich beim Land f&uuml;r deren offizielle Genehmigung stark machen&ldquo;</li> <li><strong>Sonstiges</strong>: &bdquo;Eine Vergr&ouml;&szlig;erung des KIT-Campus S&uuml;d auf dem Gel&auml;nde des Wildparkstadions halte ich f&uuml;r dringend notwendig. Dies w&uuml;rde durch einen <u>Stadionneubau in Autobahnn&auml;he</u> m&ouml;glich, f&uuml;r den ich mich seit vielen Jahren einsetze und der auch viele andere Probleme l&ouml;sen w&uuml;rde.&ldquo;</li> </ul></p> <h3>Fostiropoulos, Linke</h3> <table class="wikitable"> <tr><td>Alter</td><td>54 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>Architektur studiert</td></tr> <tr><td>Beruf</td><td>Unternehmen im Bereich der beruflichen Weiterbildung</td></tr> <tr><td>Politik</td><td>seit 12 Jahren Stadtrat</td></tr> </table> <p>Ziele und Aussagen: <ul> <li><strong>Wohnraummangel</strong>: setzt sich f&uuml;r ein kommunale Wohnungsprogramm ein</li> <li><strong>Studiticket</strong>: &bdquo;&Ouml;PNV kostenlos und &uuml;ber Steuermittel finanziert&ldquo;</li> <li><strong>Rad vs. Baustellen</strong>: nichts konkretes</li> <li><strong>Slacklinen</strong>: &bdquo;Daf&uuml;r ist das Land zust&auml;ndig.&ldquo;</li> <li><strong>Sonstiges</strong>: Kostenfreie Kindertagesst&auml;tten f&uuml;r alle Kinder von 1 bis 6, kommunales Wohnungsprogramm</li> </ul></p> <h3>Friedemann Kalmbach, W&auml;hlerliste</h3> <table class="wikitable"> <tr><td>Alter</td><td>58 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>?</td></tr> <tr><td>Beruf</td><td>Technischer Zeichner in einer Maschinenbaufabrik<br/>Gymnasiallehrer (Physik, Geographie)</td></tr> <tr><td>Politik</td><td>seit 2009 tr&auml;gt er politische Verantwortung im Gemeinderat</td></tr> </table> <p>Ziele und Aussagen: <ul> <li><strong>Wohnraummangel</strong>: kommunales Wohnungsbauprogramm, Investoren, B&uuml;rofl&auml;chen in Wohnraum umwandeln</li> <li><strong>Studiticket</strong>: &bdquo;[Ich werde] den Druck auf den KVV deutlich erh&ouml;hen, um eine moderatere Preisgestaltung zu erzielen.&ldquo;</li> <li><strong>Rad vs. Baustellen</strong>: Nichts konkretes</li> <li><strong>Slacklinen</strong>: ist nicht Sache des OB</li> <li><strong>Sonstiges</strong>: -</li> </ul></p> <h3>J&uuml;rgen Wenzel, freie W&auml;hler Karlsruhe</h3> <table class="wikitable"> <tr><td>Alter</td><td>50 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>geboren</td></tr> <tr><td>Beruf</td><td>studierte klassische Malerei und Zeichnen<br/>arbeitete als Comiczeichner, Gestalter von Plattencovern und Werbeanzeigen</td></tr> <tr><td>Politik</td><td>seit 2009 im Gemeinderat</td></tr> </table> <h3>Sascha Oehme, Unabh&auml;ngiger Kandidat</h3> <table class="wikitable"> <tr><td>Alter</td><td>42 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>?</td></tr> <tr><td>Beruf</td><td>Logistikmeister</td></tr> <tr><td>Politik</td><td>&ouml;ffentlichen Wohnbau, Abschaffung der Hundesteuer, freies W-LAN</td></tr> <tr><td>Wikipedia</td><td><a href="http://de.wikipedia.org/wiki/Ingo_Wellenreuther">Link</a></td></tr> </table> <h3>Michael B&ouml;hm, Unabh&auml;ngiger Kandidat</h3> <p>alias &bdquo;Herr Kruscht&ldquo; <table class="wikitable"> <tr><td>Alter</td><td>49 Jahre</td></tr> <tr><td>In Karlsruhe</td><td>geboren (Eggstein)</td></tr> <tr><td>Beruf</td><td>Entr&uuml;mpler<br/>Besitzer eines Blechdosenmuseums</td></tr> <tr><td>Politik</td><td>&ouml;ffentlichen Wohnbau, Abschaffung der Hundesteuer, freies W-LAN</td></tr> <tr><td>Wikipedia</td><td><a href="http://de.wikipedia.org/wiki/Ingo_Wellenreuther">Link</a></td></tr> </table></p> <p>Ist gegen die U-Bahn, m&ouml;chte das Karlsruher Rathaus auf den Werderplatz bauen. &bdquo;Das jetzige Rathaus soll eine Kindertagesst&auml;tte werden und die S&uuml;dstadt eine eigenst&auml;ndige Stadt.&ldquo; Herabsenkung des Wahlalters auf 16 Jahre.</p> <h2>Prognosen</h2> <ul> <li>48,22%: Mentrup, SPD-GR&Uuml;-KAL</li> <li>38,16%: Wellenreuther, CDU</li> <li>04,18%: Fostiropoulos, Linke</li> <li>04,05%: Kalmbach, GfK</li> <li>03,00%: Wenzel, FW</li> <li>02,39%: Oehme</li> <li>00,68%: Kruscht</li> </ul> <p>Quelle: <a href="http://ka-news.wahlfieber.de/de_du/markt/D-2012-KA-BM1--oberburgermeisterwahlen-in-karlsruhe-2012/">kanews.wahlfieber.de</a></p> <h2>Links</h2> <ol> <li><a name="ref1" href="#anchor1">&uarr;</a>: Wikipedia, <a href="http://de.wikipedia.org/wiki/Geschichte_Karlsruhes#.28Ober-.29B.C3.BCrgermeister">Geschichte Karlsruhes</a></li> </ol> Linux Scheduler http://martin-thoma.com/linux-scheduler Mon, 26 Nov 2012 22:25:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/linux-scheduler <div class="info">Der folgende Text wurde von <a href="http://klammler.eu/">Moritz Klammler</a>, einem Informatik-Studenten am KIT, als E-Mail an die interne Mailingliste der Vorlesung geschrieben. Ich habe nur ein paar Kleinigkeiten umformuliert und die Formattierung ge&auml;ndert.</div> <h2>Mailinglisten-Beitrag</h2> <p>Der in der Vorlesung vorgestellte <code>$\mathcal{O}(1)$</code> Scheduler<small><sup><a href="#ref1" name="anchor1">[1]</a></sup></small> wurde vom 2.6er Linux Kernel bis Version 2.6.23 verwendet und dann durch den sogenannten Completely Fair Scheduler (CFS)<small><sup><a href="#ref2" name="anchor2">[2]</a></sup></small> abgel&ouml;st, der Rot-Schwarz-B&auml;ume verwendet, und daher in <code>$\mathcal{O}(\log(n))$</code> l&auml;uft -- daf&uuml;r aber komplett fair ist ;-) Beide Scheduler wurden von Ingo Moln&aacute;r entworfen und gr&ouml;&szlig;tenteils implementiert. Abgesehen von den Wikipedia Artikeln fand ich auch Ingos eigene Beschreibung<small><sup><a href="#ref3" name="anchor1">[3]</a></sup></small> sehr interessant. In der pr&auml;-2.6-&Auml;ra des Linux Kernels wurde ein Scheduler verwendet, zu dessen Effizienz ich keine Angaben gefunden habe. Anhand der (ziemlich detaillierten) Beschreibung in Kapitel 10 von &bdquo;Understanding the Linux Kernel&ldquo;<small><sup><a href="#ref4" name="anchor4">[1]</a></sup></small> gehe ich jedoch davon aus, dass es <code>$\mathcal{O}(n)$</code> gewesen sein muss. Auch wenn die dort beschriebenen Algorithmen inzwischen mehrfach &uuml;berholt sind, fand ich das Kapitel sehr lesenswert.</p> <p>Wie in der Vorlesung vermutet wurde, kann man den Scheduler nat&uuml;rlich konfigurieren. Dazu ist es aber nicht notwendig, neu zu kompilieren -- noch nicht einmal neu zu booten. Stattdessen kann man (beim CFS) einfach &uuml;ber das /proc Dateisystem in die verschiedenen Dateien in</p> <p><code>/proc/sys/kernel/...</code></p> <p>schreiben. Die &Auml;nderungen werden instantan wirksam. (Und sp&auml;testens zum n&auml;chsten Reboot wieder zur&uuml;ckgesetzt, man kann also nicht viel kaputt machen.) Permanente &Auml;nderungen kann man in <code>/etc/sysctl.conf</code> schreiben. (Habe ich noch nicht probiert.)</p> <p>Ich habe ein kleines Programm geschrieben, das sehr viele Subprozesse erzeugt, die alle sinnlose Rechnungen auf der CPU ausf&uuml;hren und zwischendurch in regelm&auml;&szlig;igen Intervallen eine (eigentlich zwei) Zellen auf dem Terminal umf&auml;rben. Man kann anhand dessen, wie sich das Muster &auml;ndert, sch&ouml;n sehen, wie oft ein einzelner Prozess an die Reihe kommt, und wie lange er es bleibt, wenn er es einmal ist. Das Programm kann von <a href="http://klammler.eu/data/computer-science/kit/os/blink-1.0.tar.gz">meiner Website</a> heruntergeladen werden. In dem Archiv ist auch ein kleines Shell-Skript, <code>sched-tune.sh</code>, mit dem man die wichtigsten Parameter &auml;ndern kann. Die README Datei in dem Archiv erkl&auml;rt genauer, wie man das Programm benutzen kann.</p> <p>Da der Bildschirm beim Ausf&uuml;hren des Programms (gewollt) stark flackert, muss ich Epileptikern und anderen empfindlichen Personen unter Umst&auml;nden leider davon abraten.</p> <p>Leider l&auml;sst der Kernel keine v&ouml;llig unsinnigen Werte zu. Man kann also nur bedingt ausprobieren, welchen Einfluss extreme Einstellungen haben / h&auml;tten. Wie in Referenz 4 beschrieben, &bdquo;friert&ldquo; die grafische Oberfl&auml;che &uuml;brigens auch nicht ein, wenn man gr&ouml;&szlig;ere Scheduling Intervalle w&auml;hlt, da jeder Tastendruck einen Interrupt ausl&ouml;st, der -- egal wie geschedulet wird -- immer die Kontrolle an jenen Prozess &uuml;bergibt, der gerade das Keyboard &bdquo;gegrabbt&ldquo; hat.</p> <p>Gr&uuml;&szlig;e</p> <p>Moritz</p> <h2>Video</h2> <p>Ich habe mal ein Video von Moritz&#39; Programm gemacht: <iframe width="420" height="315" src="http://www.youtube.com/embed/DOOrbrcM3YU" frameborder="0" allowfullscreen></iframe></p> <h2>Referenzen</h2> <p>[1] <a name="ref1" href="#anchor1">&uarr;</a>: &bdquo;<a href="http://en.wikipedia.org/wiki/O%281%29_scheduler">O(1) Scheduler</a>&ldquo; in: Wikipedia, the free encyclopedia. Abgerufen am 13.&nbsp;November 2012.<br> [2] <a name="ref2" href="#anchor2">&uarr;</a>: &bdquo;<a href="http://en.wikipedia.org/wiki/Completely_Fair_Scheduler">Completely Fair Scheduler</a>&ldquo; in: Wikipedia, the free encyclopedia. Abgerufen am 13. November 2012. [3] <a name="ref3" href="#anchor3">&uarr;</a>: Ingo Moln&aacute;r, &bdquo;<a href="http://people.redhat.com/mingo/cfs-scheduler/sched-design-CFS.txt">This is the CFS scheduler</a>&ldquo;. Abgerufen am 13. November 2012. [4] <a name="ref4" href="#anchor4">&uarr;</a>: Daniel P. Bovet und Marco Cesati, &bdquo;<a href="http://oreilly.com/catalog/linuxkernel/chapter/ch10.html">Understanding the Linux Kernel</a>&ldquo;. O&#39;Reilly, 2000, abgerufen am 13. November 2012.</p> Tribonacci-Folge http://martin-thoma.com/tribonacci-folge Mon, 19 Nov 2012 19:52:00 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/tribonacci-folge <p>Folgende Aufgabe gab es (sinngem&auml;&szlig;) f&uuml;r das Modul &bdquo;Programmieren&ldquo; im zweiten &Uuml;bungsblatt 2012:</p> <p>Sei <code>$(a_n)_{n \in \mathbb{N}}$</code> eine Folge und definiert durch: <code>$a_n := \begin{cases} 1 &amp;\text{, falls } n \in \{0,1,2\}\\ a_{n-1} + a_{n-2} + a_{n-3} &amp; \text{, falls } n \geq 3 \end{cases}$</code>.</p> <p>Ich werde im folgenden mal kurz m&ouml;gliche L&ouml;sungen in Python (und eine in Java) vorstellen. Python hat bei solchen Aufgaben den Vorteil, dass es viel kompakter ist und Ganzzahlen beliebig gro&szlig; werden k&ouml;nnen.</p> <h2>H&auml;ndische L&ouml;sung</h2> <p>Bevor man irgendwas programmiert, sollte man sicherstellen, dass man es testen kann. Was w&auml;ren also die ersten paar Folgenglieder?</p> <p><code>$a_0 = a_1 = a_2 = 1, a_3 = 3, a_4 = 5, a_5 = 9, a_6 = 17, a_7 = 31, a_8 = 57$</code></p> <h2>Rekursive L&ouml;sung</h2> <p>Solche Aufgaben lassen sich h&auml;ufig sehr einfach rekursiv l&ouml;sen:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">tribonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">tribonacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">tribonacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">tribonacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span> </code></pre></div> <p>Allerdings hat diese rekursive L&ouml;sung den riesigen nachteil, dass viele Berechnungen redundant sind. Angenommen, wir wollen <code>tribonacci(5)</code> berechnen. Dann l&auml;uft folgendes ab:</p> <ol> <li>Aufruf <code>tribonacci(5)</code> <ol> <li>Aufruf <code>tribonacci(4)</code> <ol> <li>Aufruf <code>tribonacci(3)</code> <ol> <li>Aufruf <code>tribonacci(2)</code> <li>Aufruf <code>tribonacci(1)</code> <li>Aufruf <code>tribonacci(0)</code> </ol> </li> <li>Aufruf <code>tribonacci(2)</code></li> <li>Aufruf <code>tribonacci(1)</code></li> </ol> </li> <li>Aufruf <code>tribonacci(3)</code> <ol> <li>Aufruf <code>tribonacci(2)</code> <li>Aufruf <code>tribonacci(1)</code> <li>Aufruf <code>tribonacci(0)</code> </ol> </li> <li>Aufruf <code>tribonacci(2)</code> </ol> </li> </ol> <p>Man sieht deutlich, dass z.B. <code>tribonacci(3)</code> mehrfach berechnet werden muss.</p> <p>Wie kann man so was verbessern?</p> <h2>Bottom-Up Ansatz</h2> <p>Wir ben&ouml;tigen f&uuml;r ein neues Folgenglied immer nur das vorhergehende. Das kann dann so aussehen:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">tribonacciBottomUp</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">last</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">secondLast</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">thirdLast</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> <span class="n">new</span> <span class="o">=</span> <span class="n">last</span> <span class="o">+</span> <span class="n">secondLast</span> <span class="o">+</span> <span class="n">thirdLast</span> <span class="n">thirdLast</span> <span class="o">=</span> <span class="n">secondLast</span> <span class="n">secondLast</span> <span class="o">=</span> <span class="n">last</span> <span class="n">last</span> <span class="o">=</span> <span class="n">new</span> <span class="k">return</span> <span class="n">last</span> </code></pre></div> <h2>Fill it</h2> <p>Eine weitere M&ouml;glichkeit w&auml;re die schw&auml;che des rekursiven Ansatzes zu eliminieren, indem man alle bisher berechneten Werte in einem Array speichert.</p> <h2>Wertetabelle</h2> <table> <tr><th>i</th><th>a_i</th></tr> <tr><td>0</td><td>1</td></tr> <tr><td>1</td><td>1</td></tr> <tr><td>2</td><td>1</td></tr> <tr><td>3</td><td>3</td></tr> <tr><td>4</td><td>5</td></tr> <tr><td>5</td><td>9</td></tr> <tr><td>6</td><td>17</td></tr> <tr><td>7</td><td>31</td></tr> <tr><td>8</td><td>57</td></tr> <tr><td>9</td><td>105</td></tr> <tr><td>10</td><td>193</td></tr> <tr><td>11</td><td>355</td></tr> <tr><td>12</td><td>653</td></tr> <tr><td>13</td><td>1201</td></tr> <tr><td>14</td><td>2209</td></tr> <tr><td>15</td><td>4063</td></tr> <tr><td>16</td><td>7473</td></tr> <tr><td>17</td><td>13745</td></tr> <tr><td>18</td><td>25281</td></tr> <tr><td>19</td><td>46499</td></tr> <tr><td>20</td><td>85525</td></tr> <tr><td>21</td><td>157305</td></tr> <tr><td>22</td><td>289329</td></tr> <tr><td>23</td><td>532159</td></tr> <tr><td>24</td><td>978793</td></tr> <tr><td>25</td><td>1800281</td></tr> <tr><td>26</td><td>3311233</td></tr> <tr><td>27</td><td>6090307</td></tr> <tr><td>28</td><td>11201821</td></tr> <tr><td>29</td><td>20603361</td></tr> <tr><td>30</td><td>37895489</td></tr> <tr><td>31</td><td>69700671</td></tr> <tr><td>32</td><td>128199521</td></tr> <tr><td>33</td><td>235795681</td></tr> <tr><td>34</td><td>433695873</td></tr> <tr><td>35</td><td>797691075</td></tr> <tr><td>36</td><td>1467182629</td></tr> <tr><td>37</td><td>2698569577</td></tr> <tr><td>38</td><td>4963443281</td></tr> <tr><td>39</td><td>9129195487</td></tr> <tr><td>40</td><td>16791208345</td></tr> </table> <h2>Java</h2> <p>Java-Nutzer m&uuml;ssen sich dar&uuml;ber im klaren sein, dass alle Elemente, die gr&ouml;&szlig;er als 36 sind, die <code>int</code>-Grenzen sprengen. Eine L&ouml;sung f&uuml;r das &Uuml;bungsblatt k&ouml;nnte ungef&auml;hr so aussehen:</p> <div class="highlight"><pre><code class="java"><span class="cm">/** This class calculates numbers of the Tribonacci sequence. */</span> <span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">Tribonacci</span> <span class="o">{</span> <span class="cm">/**</span> <span class="cm"> * Utility classes should not have a public or default </span> <span class="cm"> * constructor.</span> <span class="cm"> */</span> <span class="kd">private</span> <span class="nf">Tribonacci</span><span class="o">()</span> <span class="o">{</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Calculate the n&#39;th Element of the Tribonacci sequence (a_n). </span> <span class="cm"> * The sequence is defined as:</span> <span class="cm"> * a_0 = a_1 = a_2 = a</span> <span class="cm"> * a_n = a_(n-1) + a_(n-2) + a_(n-3)</span> <span class="cm"> *</span> <span class="cm"> * @param n the element of the Tribonacci sequence you want to</span> <span class="cm"> * calculate</span> <span class="cm"> * @return the value of the n&#39;th element in the Tribonacci</span> <span class="cm"> * sequence</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">long</span> <span class="nf">calculateTribonacci</span><span class="o">(</span><span class="kd">final</span> <span class="kt">long</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="kt">long</span> <span class="n">last</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="kt">long</span> <span class="n">secondLast</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="kt">long</span> <span class="n">thirdLast</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="kt">long</span> <span class="n">newTri</span> <span class="o">=</span> <span class="n">last</span> <span class="o">+</span> <span class="n">secondLast</span> <span class="o">+</span> <span class="n">thirdLast</span><span class="o">;</span> <span class="n">thirdLast</span> <span class="o">=</span> <span class="n">secondLast</span><span class="o">;</span> <span class="n">secondLast</span> <span class="o">=</span> <span class="n">last</span><span class="o">;</span> <span class="n">last</span> <span class="o">=</span> <span class="n">newTri</span><span class="o">;</span> <span class="o">}</span> <span class="k">return</span> <span class="n">last</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Prints out the Tribonacci number a_36 </span> <span class="cm"> * the (37th Tribonacci number)</span> <span class="cm"> * @param args the command line arguments</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">calculateTribonacci</span><span class="o">(</span><span class="mi">36</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> Project Euler: Problem 35 http://martin-thoma.com/project-euler-problem-35 Sat, 17 Nov 2012 12:23:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/project-euler-problem-35 <p>The task in <a href="http://projecteuler.net/problem=35">Problem 35</a> of Project Euler is:</p> <blockquote>The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime. There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97. How many circular primes are there below one million?</blockquote> <h2>How to solve</h2> <p>If you have heard of the sieve of Eratosthenes, this one sounds quite easy: <ol> <li>Find all primes below one million</li> <li>For each prime, do: <ol> <li>Generate all rotations</li> <li>Check for every rotation if it is a prime</li> </ol> </li> <li>Count the number of circular primes</li> </ol></p> <h2>The implementation</h2> <h3>Sieve of Eratosthenes</h3> <p>The finds all primes below <code>$n \in \mathbb{N}$</code>. But you can make a lot of mistakes in the implementation.</p> <p>First, this is the way the sieve of Eratosthenes works:</p> <div style="width: 445px" class="wp-caption aligncenter"><a href="../images/2012/11/Sieve_of_Eratosthenes_animation.gif"><img src="../images/2012/11/Sieve_of_Eratosthenes_animation.gif" alt="" width="445" height="503" class="size-full"/></a><p class="wp-caption-text"></p></div> <p>For example, this implementation is not good:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">getPrimesBelowN</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1000000</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Sieve of Eratosthenes &quot;&quot;&quot;</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span> <span class="n">roundUp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">prime</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="n">prime</span><span class="p">))</span> <span class="n">primes</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">currentPrime</span> <span class="ow">in</span> <span class="n">primes</span><span class="p">:</span> <span class="k">for</span> <span class="n">multiplicant</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">roundUp</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">currentPrime</span><span class="p">)):</span> <span class="n">noPrime</span> <span class="o">=</span> <span class="n">multiplicant</span> <span class="o">*</span> <span class="n">currentPrime</span> <span class="k">if</span> <span class="n">noPrime</span> <span class="ow">in</span> <span class="n">primes</span><span class="p">:</span> <span class="n">primes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">noPrime</span><span class="p">)</span> <span class="k">return</span> <span class="n">primes</span> </code></pre></div> <p>Whats bad with this code? Well, just think about what it does: For every <code>noPrime</code> Python has to go through the whole list. I couldn&#39;t find how <code>in</code> is implemented, but I guess it is linear. So Python has to go through the whole list for <code>in</code>. Additionally, <code>remove</code> could also be expensive.</p> <p>How could this get improved? Here is a better solution:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">getPrimesBelowN</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1000000</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Sieve of Eratosthenes &quot;&quot;&quot;</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span> <span class="n">roundUp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">prime</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="n">prime</span><span class="p">))</span> <span class="n">primes</span> <span class="o">=</span> <span class="p">[</span><span class="bp">True</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span> <span class="n">primes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">primes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">primeList</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">currentPrime</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">primes</span><span class="p">[</span><span class="n">currentPrime</span><span class="p">]:</span> <span class="k">continue</span> <span class="n">primeList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">currentPrime</span><span class="p">)</span> <span class="k">for</span> <span class="n">multiplicant</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">roundUp</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">currentPrime</span><span class="p">)):</span> <span class="n">primes</span><span class="p">[</span><span class="n">multiplicant</span> <span class="o">*</span> <span class="n">currentPrime</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">return</span> <span class="n">primeList</span> </code></pre></div> <p>This solution does not need to search for <code>noPrime</code>, it simply jumps there in the list.</p> <p>A generator version of the sieve of Erasthostenes can be found on <a href="http://code.activestate.com/recipes/117119-sieve-of-eratosthenes/">code.activestate.com</a>.</p> <h3>isCircularPrime</h3> <p>Rotation the digits of a number is the same as cutting the number into two pieces and switching the position of the pieces:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">isCircularPrime</span><span class="p">(</span><span class="n">primes</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span> <span class="n">number</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)):</span> <span class="n">rotatedNumber</span> <span class="o">=</span> <span class="n">number</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)]</span> <span class="o">+</span> <span class="n">number</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">i</span><span class="p">]</span> <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">rotatedNumber</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">primes</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> </code></pre></div> <p>Here is the same problem as above, in the sieving algorithm: Searching through the list takes much more time than jumping to a position in the list. So this one is better:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">isCircularPrime</span><span class="p">(</span><span class="n">primes</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span> <span class="n">number</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)):</span> <span class="n">rotatedNumber</span> <span class="o">=</span> <span class="n">number</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)]</span> <span class="o">+</span> <span class="n">number</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">i</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">primes</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">rotatedNumber</span><span class="p">)]:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> </code></pre></div> <h3>Some more speedups</h2> Every prime that contains one of the digits 0, 2, 4, 6 or 8 can't be a circular prime, because one rotation exist where that digit is at the end. This rotation would be divisible by 2 and thus not be a prime (except for 2, of course). You can use the same thought for the digit 5. So you can skip those digits <h3>The final snippet</h3> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">getPrimesBelowN</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1000000</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Get all primes below n with the sieve of Eratosthenes. </span> <span class="sd"> @return: a list 0..n with boolean values that indicate if </span> <span class="sd"> i in 0..n is a prime.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span> <span class="n">primes</span> <span class="o">=</span> <span class="p">[</span><span class="bp">True</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span> <span class="n">primes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">primes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">primeList</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">roundUp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">prime</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="n">prime</span><span class="p">))</span> <span class="k">for</span> <span class="n">currentPrime</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">primes</span><span class="p">[</span><span class="n">currentPrime</span><span class="p">]:</span> <span class="k">continue</span> <span class="n">primeList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">currentPrime</span><span class="p">)</span> <span class="k">for</span> <span class="n">multiplicant</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">roundUp</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">currentPrime</span><span class="p">)):</span> <span class="n">primes</span><span class="p">[</span><span class="n">multiplicant</span> <span class="o">*</span> <span class="n">currentPrime</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">return</span> <span class="n">primes</span> <span class="k">def</span> <span class="nf">isCircularPrime</span><span class="p">(</span><span class="n">primes</span><span class="p">,</span> <span class="n">number</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Check if number is a circular prime.</span> <span class="sd"> </span> <span class="sd"> Keyword arguments:</span> <span class="sd"> primes -- a list from 0..n with boolean values that indicate if </span> <span class="sd"> i in 0..n is a prime</span> <span class="sd"> number -- the integer you want to check</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">number</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)):</span> <span class="n">rotatedNumber</span> <span class="o">=</span> <span class="n">number</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">number</span><span class="p">)]</span> <span class="o">+</span> <span class="n">number</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">i</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">primes</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">rotatedNumber</span><span class="p">)]:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Start sieving.&quot;</span><span class="p">)</span> <span class="n">primes</span> <span class="o">=</span> <span class="n">getPrimesBelowN</span><span class="p">(</span><span class="mi">1000000</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;End sieving.&quot;</span><span class="p">)</span> <span class="n">numberOfPrimes</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">print</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c"># I print them now, because I want to skip all primes</span> <span class="k">print</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c"># that contain one of those digits: 0,2,4,5,6,8</span> <span class="k">for</span> <span class="n">prime</span><span class="p">,</span> <span class="n">isPrime</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">primes</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">isPrime</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="s">&quot;2&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">))</span> <span class="ow">or</span> \ <span class="p">(</span><span class="s">&quot;4&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="s">&quot;6&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">))</span> <span class="ow">or</span> \ <span class="p">(</span><span class="s">&quot;8&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="s">&quot;0&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">))</span> <span class="ow">or</span> \ <span class="p">(</span><span class="s">&quot;5&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">prime</span><span class="p">)):</span> <span class="k">continue</span> <span class="k">if</span> <span class="n">isCircularPrime</span><span class="p">(</span><span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="n">prime</span><span class="p">)</span> <span class="n">numberOfPrimes</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Number of circular primes: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">numberOfPrimes</span><span class="p">)</span> </code></pre></div> <p>It takes about 1.096 seconds (in comparison: having the version of <code>isCircularPrime</code> that searches through the list of primes took over 5 minutes!)</p> Project Euler: Problem 33 http://martin-thoma.com/project-euler-problem-33 Wed, 14 Nov 2012 14:43:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/project-euler-problem-33 <p>The task in <a href="http://projecteuler.net/problem=33">Problem 33</a> of Project Euler is:</p> <blockquote>The fraction `$\frac{49}{98}$` is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that `$\frac{49}{98} = \frac{4}{8}$`, which is correct, is obtained by cancelling the 9s. We shall consider fractions like, `$\frac{30}{50} = \frac{3}{5}$`, to be trivial examples. There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator. If the product of these four fractions is given in its lowest common terms, find the value of the denominator.</blockquote> <h2>How to solve</h2> <p>The solution to this task is pretty straight forward. As the nominator has to have two digits and the denominator also has to be in [10, 99], we only have about <code>$100 \cdot 100 = 10000$</code> that we have to check.</p> <p>How do we check a given nominator / denominator pair? Well, we can go through each digit of the nominator and check if it is also in the denominator. If it is there, we have to check if the resulting fraction has the same value as before. If it has, we can print it.</p> <h2>My solution</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">isCuriousFraction</span><span class="p">(</span><span class="n">numerator</span><span class="p">,</span> <span class="n">denomiator</span><span class="p">):</span> <span class="k">for</span> <span class="n">digit</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">numerator</span><span class="p">):</span> <span class="k">if</span> <span class="n">digit</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">denomiator</span><span class="p">):</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="p">[(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)]:</span> <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">numerator</span><span class="p">)[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">digit</span> <span class="o">==</span> <span class="nb">str</span><span class="p">(</span><span class="n">denomiator</span><span class="p">)[</span><span class="n">j</span><span class="p">]:</span> <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">denomiator</span><span class="p">)[(</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># devision through 0 is bad</span> <span class="n">canceled</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">numerator</span><span class="p">)[(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">])</span> <span class="o">/</span> \ <span class="nb">int</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">denomiator</span><span class="p">)[(</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">])</span> <span class="n">divided</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">numerator</span><span class="p">)</span> <span class="o">/</span> <span class="n">denomiator</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">canceled</span><span class="o">-</span><span class="n">divided</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.0001</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%i</span><span class="s">/</span><span class="si">%i</span><span class="s"> = </span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">numerator</span><span class="p">,</span> \ <span class="n">denomiator</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">numerator</span><span class="p">)[(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">],</span>\ <span class="nb">str</span><span class="p">(</span><span class="n">denomiator</span><span class="p">)[(</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">]))</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span> <span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># those are not interesting</span> <span class="k">continue</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span> <span class="n">isCuriousFraction</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> </code></pre></div> <h2>Solving it without programming</h2> <p>You can also solve this without programming at all: See <a href="http://projecteuler.net/thread=33;page=8#86864">post</a>.</p> Project Euler: Problem 32 http://martin-thoma.com/project-euler-problem-32 Tue, 13 Nov 2012 10:52:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/project-euler-problem-32 <p>The task in Problem 32 of Project Euler is:</p> <blockquote>We shall say that an `$n$`-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital. The product 7254 is unusual, as the identity, `$39 \cdot 186 = 7254$`, containing multiplicand, multiplier, and product is 1 through 9 pandigital. Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital. HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.</blockquote> <h2>How to solve it</h2> <p>We have to get a check, if a number is pandigital. It could look like this:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">isPandigitalString</span><span class="p">(</span><span class="n">string</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Check if string contains a pandigital number. &quot;&quot;&quot;</span> <span class="n">digits</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="k">if</span> <span class="n">digits</span> <span class="o">&gt;=</span> <span class="mi">10</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">digits</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">string</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> </code></pre></div> <p>We also need a check if a product of two numbers is 9-pandigital:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">gives9PandigitalProduct</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="n">numbers</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">numbers</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">9</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="n">isPandigitalString</span><span class="p">(</span><span class="n">numbers</span><span class="p">)</span> </code></pre></div> <p>Now you need to figure out how to go through all possible combinations:</p> <div class="highlight"><pre><code class="python"><span class="n">products</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100000</span><span class="p">):</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="mi">100000</span><span class="p">):</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">9</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="n">gives9PandigitalProduct</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="n">products</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%i</span><span class="s"> x </span><span class="si">%i</span><span class="s"> = </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">products</span><span class="p">)))</span> </code></pre></div> <h2>One-liner</h2> <p>This is from Thaddeus Abiye from Ethiopia:</p> <div class="highlight"><pre><code class="python"><span class="k">print</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">]),</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span><span class="nb">sorted</span><span class="p">([</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">x</span><span class="p">])</span><span class="o">==</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">10</span><span class="p">)),[</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2000</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">100</span><span class="p">)]))))</span> </code></pre></div> <p>It needs one line and 173 characters, but I think it&#39;s hard to read.</p> <h2>Data about my solution</h2> <ul> <li>It worked in less than a second.</li> <li>28 LOC (including whitespaces and comments)</li> <li>719 characters for this solution (including whitespace and comments)</li> </ul> Beweise aus der booleschen Algebra http://martin-thoma.com/beweise-aus-der-booleschen-algebra Thu, 08 Nov 2012 12:18:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/beweise-aus-der-booleschen-algebra <h2>Definition</h2> <p>Edward Vermilye Huntington hat eine sehr kompakte Definition boolescher Algebren erarbeitet:</p> <p>Sei <code>$B$</code> eine Menge und <code>$\sqcap: B \times B \rightarrow B$</code> sowie <code>$\sqcup: B \times B \rightarrow B$</code> Verkn&uuml;fungen auf B. </p> <p>Weiter gelte:</p> <p><strong>H1: Kommutativgesetze</strong> <ul style="list-style-type:none;"> <li><code>$\forall a,b \in B: a \sqcap b = b \sqcap a$</code></li> <li><code>$\forall a,b \in B: a \sqcup b = b \sqcup a$</code></li> </ul></p> <p><strong>H2: Distributivgesetze</strong> <ul style="list-style-type:none;"> <li><code>$\forall a,b,c \in B: a \sqcap (b \sqcup c) = (a \sqcap b) \sqcup (a \sqcap c)$</code></li> <li><code>$\forall a,b,c \in B: a \sqcup (b \sqcap c) = (a \sqcup b) \sqcup (a \sqcap c)$</code></li> </ul></p> <p><strong>H3: Neutrale Elemente</strong> <ul style="list-style-type:none;"> <li><code>$\exists e \in B \forall a \in B: a \sqcap e = a$</code> (e wird Einselement genannt)</li> <li><code>$\exists n \in B \forall a \in B: a \sqcup n = a$</code> (n wird Nullelement genannt)</li> </ul></p> <p><strong>H4: Komplement&auml;re Elemente</strong> <ul style="list-style-type:none;"> <li><code>$\forall a \in B: \exists \bar a: a \sqcap \bar a = n \land a \sqcup \bar a = e$</code></li> </ul></p> <p>Dann wird <code>$(B, \sqcap, \sqcup)$</code> eine boolesche Algebra gennant.</p> <h2>Folgerungen</h2> <p>Sei im folgendem immer <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> eine boolesche Algebra mit dem Einselement &bdquo;1&ldquo; und dem Nullelement &bdquo;0&ldquo;.</p> <h3>Eindeutigkeit des Nullelements</h3> <p><u>Behauptung:</u> Es exisitiert genau ein Nullelement f&uuml;r <code>$\mathcal{B}$</code>. <u>Beweis:</u> direkt</p> <p>Die Existenz von mindestens einem Nullelement wird durch H3 garantiert.</p> <p>Seien <code>$n_1, n_2$</code> Nullelemente auf <code>$\mathcal{B}$</code>. Dann gilt: <code>$\begin{align} &amp; \forall a \in B: a \sqcup n_1 \stackrel{H3}{=} a\\ \Rightarrow &amp; n_2 \sqcup n_1 = n_2\\ \stackrel{H3}{\Rightarrow} &amp; n_1 = n_2 \blacksquare \end{align} $</code></p> <h3>Eindeutigkeit des Einselements</h3> <p><u>Behauptung:</u> Es exisitiert genau ein Einselement f&uuml;r <code>$\mathcal{B}$</code>. <u>Beweis:</u> direkt</p> <p>Die Existenz von mindestens einem Einselement wird durch H3 garantiert.</p> <p>Seien <code>$e_1, e_2$</code> Einselemente auf <code>$\mathcal{B}$</code>. Dann gilt:</p> <p><code>$\begin{align} &amp; \forall a \in B: a \sqcap e_1 \stackrel{H3}{=} a\\ \Rightarrow &amp; e_2 \sqcup e_1 = e_2\\ \stackrel{H3}{\Rightarrow} &amp; e_1 = e_2 \blacksquare \end{align}$</code></p> <h3>Eindeutigkeit der komplement&auml;ren Elemente</h3> <p><u>Behauptung:</u> Die komplement&auml;ren Elemente bzgl. <code>$\sqcup$</code> sind eindeutig <u>Beweis:</u> direkt Sei <code>$a \in B$</code> beliebig und es gelte: <code>$a \sqcup \bar a_1 = 0$</code> und <code>$a \sqcup \bar a_2 = 0$</code> sowie <code>$a \sqcap \bar a_1 = 1$</code> und <code>$a \sqcap \bar a_2 = 1$</code></p> <p>Schritt 1 Es gilt: <code>$\begin{align} \bar a_1 \sqcap (a \sqcup \bar a_2) &amp;\stackrel{H2}{=} (\bar a_1 \sqcap a) \sqcup (\bar a_1 \sqcap \bar a_2)\\ \Leftrightarrow \bar a_1 \sqcap 1 &amp;= 0 \sqcup (\bar a_1 \sqcap \bar a_2)\\ \Leftrightarrow \bar a_1 &amp;= \bar a_1 \sqcap \bar a_2 \end{align}$</code></p> <p>Schritt 2 Au&szlig;erdem gilt: <code>$\begin{align} \bar a_2 \sqcap (a \sqcup \bar a_1) &amp;\stackrel{H2}{=} (\bar a_2 \sqcap a) \sqcup (\bar a_2 \sqcap a_1)\\ \Leftrightarrow \bar a_2 \sqcap 1 &amp;= 0 \sqcup (\bar a_2 \sqcap \bar a_1)\\ \Leftrightarrow \bar a_2 &amp;= (\bar a_2 \sqcap \bar a_1) \stackrel{H1}{=} \bar a_1 \sqcap \bar a_2 \end{align}$</code></p> <p>Aus den Ergebnissen von Schritt 1 und Schritt 2 folgt: <code>$\bar a_1 = \bar a_2$</code>.</p> <p>Das bedeutet, zu jedem <code>$a \in B$</code> existiert genau ein Komplement. <code>$\blacksquare$</code></p> <h3>Nullelement ungleich Einselement</h3> <p><u>Behauptung:</u> <code>$0 \neq 1$</code> <u>Beweis:</u> Wegen (H3) und (H4) gilt: <ul> <li><code>$\exists 1 \in B \forall a \in B: a \sqcap 1 \stackrel{H1}{=} 1 \sqcap a = a$</code></li> <li><code>$\exists 0 \in B \forall a \in B: a \sqcup 0 \stackrel{H1}{=} 0 \sqcup a = a$</code></li> <li><code>$\forall a \in B: \exists \bar a \in B: a \sqcap \bar a \stackrel{H1}{=} 0$</code></li> <li><code>$\forall a \in B: \exists \bar a \in B: a \sqcup \bar a \stackrel{H1}{=} 1$</code></li> </ul></p> <p>Annahme: 1 = 0 <code>$\Rightarrow \forall a \in B: \exists \bar a \in B = a \sqcap \bar a = a \sqcup \bar a = 0 = 1$</code></p> <p>Hmmm ... irgendwie konnte man <code>$(0 = 1) \Rightarrow (\sqcap = \sqcup)$</code> zeigen ... aber wie genau?</p> <h3>Extremalgesetze</h3> <p><code>$\forall a \in B: 1 \sqcup a = 1$</code> <code>$\forall a \in B: 0 \sqcap a = 0$</code></p> <p>Wie beweist man das?</p> <h3>Absorptionsgesetz</h3> <h4>Version 1</h4> <p><u>Voraussetzungen:</u> Sei <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> eine boolesche Algebra. <u>Behauptung:</u> <code>$\forall a, b \in B: a \sqcup (a \sqcap b) = a$</code> <u>Beweis:</u> direkt</p> <p><code>$a \sqcup (a \sqcap b) \stackrel{H3}{=} (a \sqcap 1) \sqcup (a \sqcap b) \stackrel{H3}{=} a \sqcap (1 \sqcup b) \stackrel{\text{Extremalgesetze}}{=} a \sqcap 1 \stackrel{H3}{=} a$</code></p> <h4>Version 2</h4> <p><u>Voraussetzungen:</u> Sei <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> eine boolesche Algebra. <u>Behauptung:</u> <code>$\forall a, b \in B: a \sqcap (a \sqcup b) = a$</code> <u>Beweis:</u> Duale Aussage zu Version 1</p> <h4>Version 3</h4> <p><u>Voraussetzungen:</u> Sei <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> eine boolesche Algebra. <u>Behauptung:</u> <code>$\forall a, b \in B: a \sqcup (\bar a \sqcap b) \stackrel{H2}{=} a \sqcup b$</code> <u>Beweis:</u> direkt <code>$a \sqcup (\bar a \sqcap b) \stackrel{H2}{=} (a \sqcup \bar a) \sqcap (a \sqcup b) \stackrel{H4}{=} 1 \sqcap (a \sqcup b) \stackrel{H3}{=} a \sqcup b \blacksquare$</code></p> <h2>K&ouml;rper</h2> <p>Ist jede Boolesche Algebra ein K&ouml;rper?</p> <p>Ein K&ouml;rper ist eine Menge <code>$V$</code> mit zwei Verkn&uuml;pfungen <code>$\oplus, \otimes$</code>: <code>$(V, \oplus, \otimes)$</code>, f&uuml;r den gilt: <ul> <li><code>$(K, \oplus)$</code> ist abelsche Gruppe mit neutralem Element 0</li> <li><code>$(K \setminus \{0\}, \otimes)$</code> ist abelsche Gruppe mit neutralem Element 1</li> <li>Es gelten die Distributivgesetze: <ul> <li><code>$\forall a, b, c \in V: a\cdot (b+c) = a\cdot b+a\cdot c$</code></li> <li><code>$\forall a, b, c \in V: (a+b)\cdot c= a\cdot c+b\cdot c$</code></li> </ul> </li> </ul></p> <p>Es scheint relativ offensichtlich, dass jede boolesche Algebra ein K&ouml;rper ist. Allerdings muss man aufpassen. F&uuml;r die neutrale Elemente eines K&ouml;rpers <code>$K = (V, \oplus, \otimes)$</code> muss gelten: <ul> <li><code>$\forall a: 0 \oplus a = a$</code></li> <li><code>$\forall a: 1 \otimes a = a$</code></li> </ul></p> <p>F&uuml;r eine boolesche Algebra <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> muss gelten (H3): <ul> <li><code>$\exists 1 \in B \forall a \in B: a \sqcap 1 = a$</code></li> <li><code>$\exists 0 \in B \forall a \in B: a \sqcup 0 = a$</code></li> </ul></p> <p>F&uuml;r die Inversen von <code>$K$</code> muss gelten: <ul> <li><code>$\forall a \exists \bar a: a \oplus \bar a = 0$</code></li> <li><code>$\forall a \exists \bar a: a \otimes \bar a = 1$</code></li> </ul></p> <p>F&uuml;r die Komplemente von <code>$\mathcal{B}$</code> muss gelten: <ul> <li><code>$\forall a \in B: \exists \bar a: a \sqcap \bar a = 0$</code></li> <li><code>$\forall a \in B: \exists \bar a: a \sqcup \bar a = 1$</code></li> </ul></p> <p>Das Komplement eines Elements verkn&uuml;fpft mit <code>$\sqcap$</code> ergibt also das neutrale Element von <code>$\sqcup$</code>!</p> <p>Offensichtlich ist, dass die Schaltalgebra mit den Operatoren XOR und AND, also <code>$(\{0,1\}, XOR, AND)$</code> ein K&ouml;rper ist, da Sie offensichtlich isomorph zu <code>$\mathbb{Z}/2\mathbb{Z}$</code> ist.</p> <p><u>Behauptung:</u> Alle booleschen Algebren mit drei oder mehr Elementen sind keine K&ouml;rper <u>Beweis:</u> (<a href="http://de.wikipedia.org/wiki/Diskussion:Darstellungssatz_f%C3%BCr_Boolesche_Algebren#Beziehung zu K&ouml;rpern">danke an Chricho</a>) Sei <code>$\mathcal{B} = (B, \sqcap, \sqcup)$</code> mit <code>$|B| \geq 3$</code>. Sei <code>$a \in B$</code> mit <code>$0 \neq a \neq 1$</code>.</p> <p>Es gilt: <code>$\forall b \in B: a \land b \leq a \lneq 1 \Rightarrow a$</code> hat kein Inverses <code>$\Rightarrow \mathcal{B}$</code> ist kein K&ouml;rper <code>$\blacksquare$</code></p> <h2>Boolesche Algebren und die Schaltalgebra</h2> <p>Die wohl bekannteste boolesche Algebra ist die Schaltalgebra: <code>$(\{0,1\}, \lor, \land, 0, 1)$</code></p> <p>Allerdings ist nicht jede Boolesche Algebra eine Schaltalgebra!</p> <h2>Quellen</h2> <ul> <li>Skript &bdquo;Technische Informatik - Digitaltechnik und Entwurfsverfahren&ldquo; von Dr.-Ing. Tamim Asfour. S.33 - 37</li> <li><a href="http://ti.ira.uka.de/TI-1/Vorlesung/Vorlesung.php">Folien</a> von Dr.-Ing. Tamim Asfour</li> <li><a href="http://youtu.be/2G-MQPKylPA?t=38m12s">Vorlesung</a> von Dr.-Ing. Tamim Asfour</li> </ul> Definitionen aus Digitaltechnik http://martin-thoma.com/definitionen-aus-digitaltechnik Wed, 07 Nov 2012 12:33:53 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/definitionen-aus-digitaltechnik <div class="info">Dieser Blogpost ist vor allem f&uuml;r H&ouml;rer von Prof. Dr. Asfour im WS 2012 / 2013 interessant. Ich h&ouml;re momentan die Vorlesung bei ihm. Deshalb sind die Inhalte teilweise identisch oder zumindest sehr &auml;hnlich.</div> <p>Dieser Blogpost soll nur m&ouml;glichst gute Definitionen liefern. Ich werde ihn vermutlich bis zum Ende des Semesters immer wieder erweitern.</p> <h2>Boolesche Algebra</h2> <p><a href="http://de.wikipedia.org/wiki/Konjunktion_(Logik)">Konjunktion</a>: <code>$\land$</code> <a href="http://de.wikipedia.org/wiki/Disjunktion">Disjunktion</a>: <code>$\lor$</code></p> <div class="definition">Sei `$x$` eine Variable. L hei&szlig;t <strong>Literal</strong> `$:\Leftrightarrow L \in \{x, \bar x\}$`.</div> <div class="definition">Seien `$L_1, \dots, L_n$` Literale. `$K(x_1, \dots, x_n)$` hei&szlig;t ein <strong>Produktterm</strong> `$:\Leftrightarrow K(x_1, \dots, x_n) = \bigwedge_{i=1}^n L_i$` oder `$K = 1$` oder `$K=0$`.</div> <p>Jeder Produktterm <code>$K(x_1, \dots, x_n)$</code> kann so dargestellt werden, dass eine Variable <code>$x$</code> in h&ouml;chstens einem Literal vorkommt.</p> <div class="definition">Sei `$K(x_1, \dots, x_n)$` ein Produktterm und `$y(x_1, \dots x_n)$` eine boolesche Funktion. `$K$` hei&szlig;t <strong>Implikant</strong> von `$y :\Leftrightarrow (K \Rightarrow y)$`</div> <div class="definition">Sei `$K(x_1, \dots, x_n)$` ein Implikant der boolesche Funktion `$y(x_1, \dots x_n)$`. `$K$` hei&szlig;t <strong>Minterm</strong> von `$y :\Leftrightarrow$` F&uuml;r jede Variable `$x_i$` in `$y$` kommt genau ein mal in `$K$` als Literal vor.</div> <div class="definition">Sei `$y(x_1, \dots x_n)$` eine boolesche Funktion und `$x$` ein boolescher Ausdruck, der `$y$` entspricht. `$x$` hei&szlig;t <strong>disjunktive Normalform</strong> (DNF) von `$y :\Leftrightarrow$` `$x=\bigvee_{i=0}^k K_i, \; k \leq 2^n - 1:\quad K_i \neq K_j \Leftrightarrow i \neq j$`</div> <div class="definition">Sei `$D(x_1, \dots, x_m)$` eine Disjunktion von Literalen `$\bigvee_{i=1}^m L_i$` oder die Konstante &bdquo;0&ldquo; oder die Konstante &bdquo;1&ldquo;. Sei weiter `$y(x_1, \dots x_n)$` eine boolesche Funktion. `$D$` hei&szlig;t <strong>Implikat</strong> von `$y :\Leftrightarrow \bar D \Rightarrow \bar y$`</div> <p>Summenterm ist ein Synonym zu Implikat.</p> <div class="definition">Sei `$y(x_1, \dots x_n)$` eine boolesche Funktion und `$D$` ein Implikat von `$y$`. `$D$` hei&szlig;t <strong>Maxterm</strong> von `$y :\Leftrightarrow$` Ein Literal jeder Variable `$x_i$` der Funktion `$y$` kommt in `$D$` genau einmal vor.</div> <p>Beispiele: <table class="wikitable"> <tr> <th>&nbsp;</th> <th>Minterm</th> <th>Maxterm</th> </tr> <tr> <td>0</td> <td><code>$\bar a \bar b \bar c$</code></td> <td><code>$a \lor b \lor c$</code></td> </tr> <tr> <td>1</td> <td><code>$a \bar b \bar c$</code></td> <td><code>$\bar a \lor b \lor c$</code></td> </tr> <tr> <td>2</td> <td><code>$\bar a b \bar c$</code></td> <td><code>$a \lor \bar b \lor c$</code></td> </tr> <tr> <td>3</td> <td><code>$a b \bar c$</code></td> <td><code>$\bar a \lor \bar b \lor c$</code></td> </tr> <tr> <td>4</td> <td><code>$\bar a \bar b c$</code></td> <td><code>$a \lor b \lor \bar c$</code></td> </tr> <tr> <td>5</td> <td><code>$a \bar b c$</code></td> <td><code>$\bar a \lor b \lor \bar c$</code></td> </tr> <tr> <td>6</td> <td><code>$\bar a b c$</code></td> <td><code>$a \lor \bar b \lor \bar c$</code></td> </tr> <tr> <td>0</td> <td><code>$a b c$</code></td> <td><code>$\bar a \lor \bar b \lor \bar c$</code></td> </tr> </table></p> <div class="definition">Ein boolescher Ausdruck der Form `$\bigwedge_i \bigvee_j (\neg)x_{ij}$` wird <strong>konjunktive Normalform</strong> (KNF) genannt.</div> What is the best programming language? http://martin-thoma.com/what-is-the-best-programming-language Sat, 03 Nov 2012 10:48:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-is-the-best-programming-language <p>There is no such thing as a best programming language. Sorry about that, I&#39;ve just thought it would be a catchy title. I would rather choose my tools after I know the problem I have to solve.</p> <p>Some programming languages are very good at some tasks. I don&#39;t know any that is very good at every task.</p> <p>This comic illustrates what I mean:</p> <div style="width: 582px" class="wp-caption alignnone"><a href="../images/2012/07/testing_cartoon.jpg"><img src="../images/2012/07/testing_cartoon.jpg" alt="" width="582" height="402" class="size-full wp-image-32731 "/></a><p class="wp-caption-text"></p></div> <h2>Bash</h2> <p>The bash is great for tiny tasks where other programs are involved. <h3>Example</h3> Resizing all jpg-images in a given folder to a maximum resolution of 1600x1600 while maintaining the aspect ratio:</p> <div class="highlight"><pre><code class="bash"><span class="k">for </span>i in *.JPG<span class="p">;</span><span class="k">do </span>convert <span class="s2">&quot;`$i&quot;</span> -resize 1600x1600 <span class="s2">&quot;$`{i%.JPG}-resized.jpg&quot;</span><span class="p">;</span> <span class="k">done</span> </code></pre></div> <p>See <a href="../converting-files-with-linux/">Converting Files with Linux</a> for more examples. <h2>Python</h2> Python does a incredibly well job for small problems. I don&#39;t have experience with big projects, but some have been done using Python (see list below). Python is dynamically typed, offers a lot of functions out of the box and is easy to learn and understand. You might argue that Python is executable Pseudocode as it is so easy to read. Additionally, it offers a very neat library for math functions with <a href="http://docs.scipy.org/doc/">NumPy</a>.</p> <p>Examples of Python-Code in applications include: <ul> <li><a href="http://security.stackexchange.com/a/2897">PDF malware analysis</a></li> <li><a href="http://en.wikipedia.org/wiki/BitTorrent_(software)">BitTorrent</a></li> <li>My <a href="../python-one-liners-for-project-euler/">ProjectEuler Snippets</a> :-)</li> <li>Scripting within an application: <ul> <li><a href="http://en.wikipedia.org/wiki/GIMP">GIMP</a></li> <li><a href="http://en.wikipedia.org/wiki/Blender_(software)">Blender</a></li> </ul> </li> <li>Websites and Services: <ul> <li><a href="http://en.wikipedia.org/wiki/GNU_Mailman">GNU Mailman</a></li> <li><a href="http://en.wikipedia.org/wiki/Reddit">Reddit</a></li> <li><a href="http://en.wikipedia.org/wiki/Trac">Trac</a></li> </ul> </li> </ul> <h2>Java</h2> Java is used in the economy for <strong>simple, but huge tasks</strong>. It is <a href="http://en.wikipedia.org/wiki/Type_system#Static_typing">static</a> and <a href="http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing">strong</a> typed, has some widely used <a href="http://www.oracle.com/technetwork/java/codeconv-138413.html">coding convetions</a>, is easy to learn and has a big library.</p> <p>Here are some examples for programs written in Java: <ul> <li>Mars Rovers (<a href="http://java.sys-con.com/node/39220">source</a>)</li> <li>BitTorrent client <a href="http://en.wikipedia.org/wiki/Vuze">Vuze</a></li> <li>Sites that have URLs like &quot;<em>.do&quot;, &quot;</em>.jsp&quot; and &quot;...servlet...&quot; are most likely written in Java.</li> <li>Games: <ul> <li><a href="http://en.wikipedia.org/wiki/FreeCol">FreeCol</a></li> <li><a href="http://en.wikipedia.org/wiki/Minecraft">Minecraft</a></li> </ul> </li> </ul> <h2>C++</h2> C++ is easy to write and blazing-fast. See <a href="../matrix-multiplication-python-java-cpp/">Performance of Matrix multiplication in Python, Java and C++</a>.</p> <p>Some projects done in C++ are: <ul> <li>NASA flight software: 300k LOC (<a href="http://trs-new.jpl.nasa.gov/dspace/bitstream/2014/37499/1/05-0539.pdf">source</a>)</li> <li><a href="http://en.wikipedia.org/wiki/Google_Chrome">Chrome</a>, <a href="http://en.wikipedia.org/wiki/Firefox">Firefox</a></li> <li>Games: <ul> <li><a href="http://en.wikipedia.org/wiki/Cube_2:_Sauerbraten">Cube 2: Sauerbraten</a></li> <li><a href="http://en.wikipedia.org/wiki/UFO:_Alien_Invasion">UFO: Alien Invasion</a></li> <li><a href="http://en.wikipedia.org/wiki/The_Battle_for_Wesnoth">The Battle for Wesnoth</a></li> <li><a href="http://www.openclonk.org/">OpenClonk</a> (<a href="http://hg.openclonk.org/openclonk/">Repository</a>)</li> <li><a href="http://www.openlierox.net/">OpenLierox</a> (<a href="https://github.com/albertz/openlierox">Repository</a>)</li> <li><a href="http://secretmaryo.org/">Secret Maryo Chronicles</a> (<a href="https://github.com/FluXy/SMC">Repository</a>)</li> </ul> </li> </ul> <h2>C</h2> See <a href="http://programmers.stackexchange.com/questions/103897/is-the-c-programming-language-still-used">Is C still used?</a> and a <a href="http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918">comment from Linus Torvalds</a>.</p> <p>Programs done with C: <ul> <li><a href="http://jonls.dk/freeserf/">Freeserf</a> (<a href="https://github.com/jonls/freeserf">Repository</a>)</li> </ul> <h2>See also</h2> <ul> <li><a href="http://readwrite.com/2012/06/05/5-ways-to-tell-which-programming-lanugages-are-most-popular">5 Ways to Tell Which Programming Languages are Most Popular</a></li> <li><a href="http://osgameclones.com/">OpenGameClones</a></li> </ul></p> <h2>Matlab</h2> <p><a href="http://stackoverflow.com/q/179904/562769">What is MATLAB good for? Why is it so used by universities? When is it better than Python?</a></p> <p>Do you know some more programs that are famous and should be in these lists? Preferably with an open repository?</p> Error correcting Codes http://martin-thoma.com/error-correcting-codes Fri, 26 Oct 2012 20:29:51 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/error-correcting-codes <div class="info">This blogpost is strongly related to <a href="http://page.math.tu-berlin.de/~felsner/DMSWe/Aufgaben/codes.pdf">this germand PDF</a> of a pupils' competition in which I have participated in 2008.</div> <p>Today, we have a lot of data that is stored or transferred in a binary way. Once in a while an error occurs and single bits get switched from 0 to 1 or the other way around. <a href="http://en.wikipedia.org/wiki/Coding_theory">Coding theory</a> tries to find algorithms with which you can <strong>detect</strong> and <strong>correct</strong> errors.</p> <h2>Introduction</h2> <p>To keep it simple, we make a small example. We have <code>$2^3 = 8$</code> valid messages:</p> <p>Message A: (0, 0, 0) Message B: (0, 0, 1) Message C: (0, 1, 0) Message D: (0, 1, 1) Message E: (1, 0, 0) Message F: (1, 0, 1) Message G: (1, 1, 0) Message H: (1, 1, 1)</p> <p>I will call the set <code>$c_1 := \{A, B, C, D, E, F, G, H\}$</code> of those messages a <strong>code</strong>.</p> <p>Now Alice wants to send message A to Bob. If one error occurs, Bob receives either message B, message C or message E. As all of those are valid messages, he might not notice that an error occurred (and even more not be able to correct the error).</p> <p>How could Alice and Bob solve this problem? </p> <h2>Redundancy</h2> <p>Well, a simple solution would be to send the message twice. Or, almost the same, sending once a message with redundant information. So the new messages are:</p> <p>Message A&#39;: (0, 0, 0, 0, 0, 0) Message B&#39;: (0, 0, 1, 0, 0, 1) Message C&#39;: (0, 1, 0, 0, 1, 0) Message D&#39;: (0, 1, 1, 0, 1, 1) Message E&#39;: (1, 0, 0, 1, 0, 0) Message F&#39;: (1, 0, 1, 1, 0, 1) Message G&#39;: (1, 1, 0, 1, 1, 0) Message H&#39;: (1, 1, 1, 1, 1, 1)</p> <p><code>$c_2 := \{A&#39;, B&#39;, C&#39;, D&#39;, E&#39;, F&#39;, G&#39;, H&#39;\}$</code></p> <p>If Bob gets a message with only one error, he can detect it. But he still isn&#39;t able to correct it: Alice send Message A and an error occurred at the first (most significant) bit. Bob can see that this is not a valid message, but if he thinks that only one error occurred, it is equally likely that Alice sent message A or message E.</p> <p>Can we do better?</p> <h2>Hamming distance</h2> <p>A useful tool is the so called &quot;<a href="http://en.wikipedia.org/wiki/Hamming_distance">Hamming distance</a>&quot;. </p> <p>The set of all 0/1 tuples of the length <code>$n$</code> is called <code>$\mathcal{F}_n$</code>. </p> <p>Examples: <code>$\begin{align} \{A, B, C, D, E, F, G, H\} &amp;= \mathcal{F}_3\\ \{A&#39;, B&#39;, C&#39;, D&#39;, E&#39;, F&#39;, G&#39;, H&#39;\} &amp;\subsetneq \mathcal{F}_8 \end{align}$</code></p> <p><code>$A[i]$</code> is the <code>$i$</code>-th bit of a message <code>$A$</code> with <code>$i \in \{0, \dots, (n-1)\}$</code></p> <p><code>$\oplus : \{0,1\} \times \{0,1\} \rightarrow \{0,1\}$</code> defined as <code>$\oplus(a, b) := \begin{cases} 0 &amp; \text{, if } a = b\\ 1 &amp; \text{, if } a \neq b\\ \end{cases}$</code>. (<code>$\oplus$</code> is XOR).</p> <p>The Hamming distance is a function <code>$h: \mathcal{F}_n \times \mathcal{F}_n \rightarrow \mathbb{N}_0$</code> defined as: <code>$\displaystyle h(A, B) := \sum_{i=0}A[i] \oplus B[i]$</code></p> <p>The minimum Hamming distance is defined as: <code>$\displaystyle h_\text{min}(\text{code}) = \min(\{h(A, B) | A, B \in \text{code}, A \neq B\})$</code></p> <h3>First example</h3> <table class="wikitable"> <tr> <th>&nbsp;</th> <th>A</th> <th>B</th> <th>C</th> <th>D</th> <th>E</th> <th>F</th> <th>G</th> <th>H</th> </tr> <tr> <th>A</th> <td>0</td> <td>1</td> <td>1</td> <td>2</td> <td>1</td> <td>2</td> <td>2</td> <td>3</td> </tr> <tr> <th>B</th> <td>1</td> <td>0</td> <td>2</td> <td>1</td> <td>2</td> <td>1</td> <td>3</td> <td>2</td> </tr> <tr> <th>C</th> <td>1</td> <td>2</td> <td>0</td> <td>1</td> <td>2</td> <td>3</td> <td>2</td> <td>2</td> </tr> <tr> <th>D</th> <td>2</td> <td>1</td> <td>1</td> <td>0</td> <td>3</td> <td>2</td> <td>2</td> <td>1</td> </tr> <tr> <th>E</th> <td>1</td> <td>2</td> <td>2</td> <td>3</td> <td>0</td> <td>1</td> <td>1</td> <td>2</td> </tr> <tr> <th>F</th> <td>2</td> <td>1</td> <td>3</td> <td>2</td> <td>1</td> <td>0</td> <td>2</td> <td>1</td> </tr> <tr> <th>G</th> <td>2</td> <td>3</td> <td>1</td> <td>2</td> <td>1</td> <td>1</td> <td>0</td> <td>1</td> </tr> <tr> <th>H</th> <td>3</td> <td>2</td> <td>2</td> <td>1</td> <td>2</td> <td>1</td> <td>1</td> <td>0</td> </tr> </table> <p><code>$h_\text{min}(c_1) = 1$</code></p> <h3>Second example</h3> <table class="wikitable"> <tr> <th>&nbsp;</th> <th>A'</th> <th>B'</th> <th>C'</th> <th>D'</th> <th>E'</th> <th>F'</th> <th>G'</th> <th>H'</th> </tr> <tr> <th>A'</th> <td>0</td> <td>2</td> <td>2</td> <td>4</td> <td>2</td> <td>4</td> <td>4</td> <td>6</td> </tr> <tr> <th>B'</th> <td>2</td> <td>0</td> <td>4</td> <td>2</td> <td>4</td> <td>2</td> <td>6</td> <td>4</td> </tr> <tr> <th>C'</th> <td>2</td> <td>4</td> <td>0</td> <td>2</td> <td>4</td> <td>6</td> <td>2</td> <td>4</td> </tr> <tr> <th>D</th> <td>4</td> <td>2</td> <td>2</td> <td>0</td> <td>6</td> <td>4</td> <td>4</td> <td>2</td> </tr> <tr> <th>E'</th> <td>2</td> <td>4</td> <td>4</td> <td>6</td> <td>0</td> <td>2</td> <td>2</td> <td>4</td> </tr> <tr> <th>F'</th> <td>4</td> <td>2</td> <td>6</td> <td>4</td> <td>2</td> <td>0</td> <td>4</td> <td>2</td> </tr> <tr> <th>G'</th> <td>4</td> <td>6</td> <td>2</td> <td>4</td> <td>2</td> <td>4</td> <td>0</td> <td>2</td> </tr> <tr> <th>H'</th> <td>6</td> <td>4</td> <td>4</td> <td>2</td> <td>4</td> <td>2</td> <td>2</td> <td>0</td> </tr> </table> <p><code>$h_\text{min}(c_2) = 2$</code></p> <h2>Detection and correction of errors</h2> <p>If I didn&#39;t make a typo, those tables should be symmetrical (as XOR is symmetrical) and the hamming distance of a message to itself is 0. </p> <p>The higher the minimum hamming distance of a code is, the more errors can be detected and corrected. In fact, you can quite easily quantise the relationship:</p> <div class="definition">Let `$c$` be a code with `$h_\text{min}(c) = 2e + 1 \quad e \in \mathbb{N}^+$`. `$2e$` is the maximum number of errors that can be detected and `$e$` is the maximum number of errors that can be corrected.</div> <p>A code with length <code>$n$</code> which has <code>$M$</code> elements and a minimum Hamming distance of <code>$d$</code> is called a <code>$(n, M, d)$</code>-Code.</p> <p>Example: <code>$c_1$</code> is a <code>$(3, 8, 1)$</code> code and <code>$c_2$</code> is a <code>$(6, 8, 2)$</code> code.</p> <p>The task of coding thery is: You&#39;re given a <code>$n$</code> and a <code>$d$</code> and you should find the code words so that M is as high as possible.</p> <h3>Example of a (6, 8, 3)-Code</h3> <p><code>$\begin{align} c_3 = \{&amp;(1,1,1,1,1,1),\\ &amp;(0,0,0,0,1,1),\\ &amp;(0,0,1,1,0,0),\\ &amp;(0,1,0,1,0,1),\\ &amp;(0,1,1,0,1,0),\\ &amp;(1,0,0,1,1,0),\\ &amp;(1,0,1,0,0,1),\\ &amp;(1,1,0,0,0,0)\} \end{align} $</code></p> <h2>Hamming codes</h2> <p><a href="http://en.wikipedia.org/wiki/Hamming_code">Hamming codes</a> are a family of <code>$(2^k - 1, 2^{(2^k -1)-k}, 3), \quad k \geq 2$</code> codes. This means, every hamming code can only correct one error.</p> <p>The idea behind Hamming codes is to save in one bit if the number of a fixed set of positions of the message is even or odd. This is called parity and done with XOR. The parity-bit is saved at the end of the message (or, just another point of view: the positions that are powers of two (1, 2, 4, 8, ...) of each message are only parity bits. This are obviously <code>$\lceil \log_2(\text{length of code}) \rceil = \lceil \log(2^k - 1) \rceil = k$</code>).</p> <p>Wikipedia has a really nice image for that: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/10/hamming-code-parity.png"><img src="../images/2012/10/hamming-code-parity.png" alt="" width="500" height="95" class="size-full wp-image-47691"/></a><p class="wp-caption-text"></p></div></p> <p>Now, how are the parity-bits calculated? Well, think of each messages as a vector in <code>$\{0,1\}^{(2^k - 1) - k}$</code>. Then you define a matrix <code>$G \in \{0,1\}^{2^k - 1} \times \{0,1\}^{(2^k - 1) - k}$</code>. Now you can get the codewords <code>$c$</code> by multiplying the datawords <code>$d$</code> (messages) with <code>$G$</code>: <code>$c = G \cdot d$</code>. This is the reason why Hamming-Codes are called &quot;linear codes&quot;. They can be obtained by a linear function.</p> <p>How do I get the generator-matrix <code>$G$</code>? I don&#39;t know it and my internet searches didn&#39;t reveal any solution. Do you know one?</p> A practical approach to floats http://martin-thoma.com/a-practical-approach-to-floats Tue, 23 Oct 2012 10:40:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/a-practical-approach-to-floats <p>If you make a computer science degree, you will have to learn how numbers are internally represented. Most of the time, you get explanations like the pictures below:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/10/IEEE_754_single_precision.png"><img src="../images/2012/10/IEEE_754_single_precision.png" alt="" width="500" height="74" class="size-full wp-image-47381"/></a><p class="wp-caption-text"></p></div> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/10/float-scheme.png"><img src="../images/2012/10/float-scheme.png" alt="" width="500" height="64" class="size-full wp-image-47361"/></a><p class="wp-caption-text"></p></div> <p>You will (have to) learn how <a href="http://en.wikipedia.org/wiki/IEEE_floating_point">IEEE 754 floats</a> are structured on a bit-wise level. But I also like to check if it is correct, what I&#39;ve learned.</p> <p>So this is how you can check it: </p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdint.h&gt;</span> <span class="cp">#include &lt;stdio.h&gt; </span><span class="c1">// printf</span> <span class="cp">#include &lt;limits.h&gt; </span><span class="c1">// INT_MAX, UINT_MAX, ...</span> <span class="cp">#include &lt;math.h&gt; </span><span class="c1">// needed for NAN</span> <span class="k">union</span> <span class="n">myUnion</span> <span class="p">{</span> <span class="kt">uint32_t</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// unsigned integer 32-bit type (on every machine)</span> <span class="kt">float</span> <span class="n">f</span><span class="p">;</span> <span class="c1">// a type you want to play with</span> <span class="p">};</span> <span class="kt">void</span> <span class="nf">printValue</span><span class="p">(</span><span class="k">union</span> <span class="n">myUnion</span> <span class="n">u</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;uint32_t</span><span class="se">\t</span><span class="s">:</span><span class="se">\t</span><span class="s">%u</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">i</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Bits</span><span class="se">\t\t</span><span class="s">:</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">31</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%i&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">u</span><span class="p">.</span><span class="n">i</span> <span class="o">&gt;&gt;</span> <span class="n">i</span><span class="p">)</span> <span class="o">%</span> <span class="mi">2</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;.&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">31</span> <span class="o">||</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">23</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;|&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">Number</span><span class="se">\t\t</span><span class="s">:</span><span class="se">\t</span><span class="s">%0.10f</span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">f</span><span class="p">);</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">setSign</span><span class="p">(</span><span class="k">union</span> <span class="n">myUnion</span> <span class="o">*</span><span class="n">u</span><span class="p">,</span> <span class="kt">char</span> <span class="n">sign</span><span class="p">)</span> <span class="p">{</span> <span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="p">(</span><span class="mh">0xffffffff</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">31</span><span class="p">)))</span> <span class="o">+</span> <span class="p">(</span><span class="n">sign</span> <span class="o">&lt;&lt;</span> <span class="mi">31</span><span class="p">);</span> <span class="p">}</span> <span class="cm">/**</span> <span class="cm"> * The exponent has 8 bits.</span> <span class="cm"> * When all bits are 0, you switch to denormalized numbers.</span> <span class="cm"> * When all bits are 1, you get either NaN or infinity, depending on</span> <span class="cm"> * your characteristic. If the characteristic is 0, you get infinity.</span> <span class="cm"> * Otherwise NaN.</span> <span class="cm"> */</span> <span class="kt">void</span> <span class="nf">setExponent</span><span class="p">(</span><span class="k">union</span> <span class="n">myUnion</span> <span class="o">*</span><span class="n">u</span><span class="p">,</span> <span class="kt">char</span> <span class="n">exponent</span><span class="p">)</span> <span class="p">{</span> <span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="p">(</span><span class="mh">0xffffffff</span> <span class="o">-</span> <span class="p">(</span><span class="mh">0xff</span> <span class="o">&lt;&lt;</span> <span class="mi">23</span><span class="p">)))</span> <span class="o">+</span> <span class="p">(</span><span class="n">exponent</span> <span class="o">&lt;&lt;</span> <span class="mi">23</span><span class="p">);</span> <span class="p">}</span> <span class="cm">/**</span> <span class="cm"> * The mantissa has 23 bits.</span> <span class="cm"> */</span> <span class="kt">void</span> <span class="nf">setMantissa</span><span class="p">(</span><span class="k">union</span> <span class="n">myUnion</span> <span class="o">*</span><span class="n">u</span><span class="p">,</span> <span class="kt">int</span> <span class="n">mantissa</span><span class="p">)</span> <span class="p">{</span> <span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span><span class="o">-&gt;</span><span class="n">i</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="p">(</span><span class="mh">0xffffffff</span> <span class="o">-</span> <span class="p">(</span><span class="mh">0xff</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">)))</span> <span class="o">+</span> <span class="p">(</span><span class="n">mantissa</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="k">union</span> <span class="n">myUnion</span> <span class="n">testVar</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Manual guessing</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="n">testVar</span><span class="p">.</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">setSign</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">testVar</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="n">setExponent</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">testVar</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">);</span> <span class="n">setMantissa</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">testVar</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">);</span> <span class="n">printValue</span><span class="p">(</span><span class="n">testVar</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;What does UINT_MAX evaluate to?</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="n">testVar</span><span class="p">.</span><span class="n">i</span> <span class="o">=</span> <span class="n">UINT_MAX</span><span class="p">;</span> <span class="n">printValue</span><span class="p">(</span><span class="n">testVar</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;What does nan evaluate to?</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="n">testVar</span><span class="p">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">NAN</span><span class="p">;</span> <span class="n">printValue</span><span class="p">(</span><span class="n">testVar</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;The example above and switched first bit on</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="n">testVar</span><span class="p">.</span><span class="n">i</span> <span class="o">=</span> <span class="mh">0xbf200000</span><span class="p">;</span> <span class="n">printValue</span><span class="p">(</span><span class="n">testVar</span><span class="p">);</span> <span class="p">}</span> </code></pre></div> <p>I think I have tried all interesting values. Have fun trying it yourself :-)</p> <p>(hmm ... I could also try to make a visualization ... I will think about this when I have more time)</p> Java Puzzle #14: Integers http://martin-thoma.com/java-puzzle-14-integers Mon, 22 Oct 2012 10:00:44 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-14-integers <p>What is the output of the following script?</p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">SomeClass</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">2147483647</span><span class="o">;</span> <span class="c1">// 2147483647 == 2**31 - 1</span> <span class="k">if</span> <span class="o">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Everything&#39;s ok:&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;It&#39;s weird:&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;x = &quot;</span> <span class="o">+</span> <span class="n">x</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;2*x = &quot;</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="text">It&#39;s weird: x = 2147483647 2*x = -2 </code></pre></div> <h2>Explanation</h2> <p><code>2*x</code> is out of Java Integer range, so it comes back at the other end.</p> Programmieren Tutorium http://martin-thoma.com/programmieren-tutorium Sun, 21 Oct 2012 18:59:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/programmieren-tutorium <div class="info">Programmieren ist ein Modul am <a href="http://de.wikipedia.org/wiki/Karlsruher_Institut_f%C3%BCr_Technologie">KIT</a>. Dieser Blogpost richtet sich also vor allem an Studenten des KIT, die im WS 2012/2013 dieses Modul belegen und mein Tutorium besuchen. Er wird regelmäßig aktualisiert.</div> <h2>Vorlesung</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/videoseries?list=PL22ZNLSohCREsVdSWmjbuST0ba64OctHk&amp;hl=en_US" frameborder="0" allowfullscreen></iframe> <h2>Daten</h2> <p>Es gibt momentan (Stand: 10.10.2012) 820 Studenten, in der Programmieren-Vorlesung: <ul> <li>530 Informatiker</li> <li>130 Informationswirte</li> <li>60 Wiederholer</li> <li>70 andere Fakultäten</li> <li>20 Schüler-Studenten</li> </ul></p> <p>(Ich weiß, dass das in der Summe nur 810 Studenten sind. Aber leider hatte ich nur eine mündliche Quelle und kann es deshalb nicht ausbessern.)</p> <h2>Folien</h2> <p>Sind <a href="https://github.com/MartinThoma/prog-ws1213">hier</a> zu finden. Dort sind auch Code-Beispiele aus dem Tutorium.</p> <p>Die <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/presentations/Programmieren-Tutorium">LaTeX-Quelldateien</a> stehen auch zur Verfügung. Wenn ihr diese verwendet, dann verlinkt bitte auf <code>martin-thoma.com/programmieren-tutorium</code>.</p> <p>Die Einverständniserklärung (Disclaimer) könnt ihr <a href="https://github.com/MartinThoma/prog-ws1213/blob/master/Dokumente/2012-10-15_Einverst%C3%A4ndniserklaerung.pdf?raw=true">hier</a> herunterladen.</p> <h2>Tutorials</h2> <p>Folgendes textbasierte Tutorial wurde mir von einem Studenten empfohlen: <a href="http://www.java-blog-buch.de/inhaltsverzeichnis/">Java Blog Buch</a></p> <p>Aber hier sind <a href="../learning-java/">Video-Tutorials</a> zu finden.</p> <p>Ich habe gerade <a href="http://www.javatutorialhub.com/java-platform.html">javatutorialhub.com</a> gefunden. Das erweckt auch einen guten ersten Eindruck.</p> <p>Auf Udacity, einer Online-Universität, gibt es eine <a href="https://www.udacity.com/course/cs046">Einführung in die Programmierung mit Java</a>. </p> <h2>Artikel</h2> <p>Ich habe ein paar Artikel geschrieben, die für euch interessant sein könnten:</p> <ul> <li><a href="../tribonacci-folge/">Tribonacci-Folge</a></li> <li><a href="../how-to-sort-with-java/">How to sort with Java?</a></li> </ul> <h2>Links</h2> <h3>Uni-Links</h3> <ul> <li><a href="https://praktomat.info.uni-karlsruhe.de/">Praktomat</a></li> <li><a href="http://baldur.iti.uka.de/programmieren/">Folien, Übungsblätter und Checkstyle</a> (offiziell)</li> <li><a href="http://verialg.iti.kit.edu/english/583.php">Carsten Sinz</a></li> <li><a href="https://praktomat.info.uni-karlsruhe.de/praktomat_2012_WS_Abschluss">Abschlussaufgaben-Praktomat</a> (nur über VPN/KIT-Netz)</li> </ul> <h3>Weiterführende Links</h3> <ul> <li><a href="http://docs.oracle.com/javase/7/docs/">JavaDoc</a> und <a href="http://docs.oracle.com/javase/7/docs/api/">Java API</a></li> <li><a href="http://stackoverflow.com/">StackOverflow</a></li> <li><a href="http://www.youtube.com/watch?v=aAb7hSCtvGw">How To Design A Good API and Why it Matters</a></li> </ul> <h2>Für Tutoren</h2> <p>Das SVN ist hier: <code>https://s<em>thoma@svnserver.informatik.kit.edu/i12/svn/VeriAlg</code> Wobei ihr natürlich s</em>thoma durch euren ATIS-Account ersetzen müsst.</p> C Puzzle #2 http://martin-thoma.com/c-puzzle-2 Sat, 20 Oct 2012 15:00:53 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/c-puzzle-2 <p>What is the output of the following script? Why? How can it be fixed to get the expected output?</p> <div class="highlight"><pre><code class="c"><span class="cp">#define __STDC_FORMAT_MACROS</span> <span class="cp">#include &lt;inttypes.h&gt;</span> <span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">uint64_t</span> <span class="n">testvar</span><span class="p">;</span> <span class="n">testvar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">30</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;2^30 = %&quot;</span> <span class="n">PRIu64</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">testvar</span><span class="p">);</span> <span class="n">testvar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">31</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;2^31 = %&quot;</span> <span class="n">PRIu64</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">testvar</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="text">2^30 = 1073741824 2^31 = 18446744071562067968 </code></pre></div> <h2>Expected output</h2> <div class="highlight"><pre><code class="text">2^30 = 1073741824 2^31 = 2147483648 </code></pre></div> <h2>Explanation</h2> <p><code>1&lt;<30</code> does a bitshift for <code>int</code>, not for <code>uint64_t</code></p> <h2>How to fix it</h2> <p>Add a typecast:</p> <div class="highlight"><pre><code class="c"><span class="cp">#define __STDC_FORMAT_MACROS</span> <span class="cp">#include &lt;inttypes.h&gt;</span> <span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">uint64_t</span> <span class="n">testvar</span><span class="p">;</span> <span class="n">testvar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">30</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;2^30 = %&quot;</span> <span class="n">PRIu64</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">testvar</span><span class="p">);</span> <span class="n">testvar</span> <span class="o">=</span> <span class="p">((</span><span class="kt">uint64_t</span><span class="p">)</span> <span class="mi">1</span><span class="p">)</span><span class="o">&lt;&lt;</span><span class="mi">31</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;2^31 = %&quot;</span> <span class="n">PRIu64</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">testvar</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> Review des Acer Travelmate 5744Z http://martin-thoma.com/review-des-acer-travelmate-5744z Fri, 19 Oct 2012 16:57:30 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/review-des-acer-travelmate-5744z <p>Vor ein paar Tagen ist mein <a href="http://support.acer.com/us/en/product/default.aspx?tab=1&modelId=3823">Acer Travelmate 5744Z</a>, das ich bei Amazon f&uuml;r 305,95 Euro bekommen habe, angekommen. Ich habe es mit &bdquo;Linux&ldquo; als System gekauft. Wie sich herausstellte, ist MeeGo release 1.0 mit dem Kernel 2.6.37, installiert. Das System startet zwar in sensationellen 29 Sekunden, aber Ubuntu ist mir doch lieber.</p> <p>edit: <em>argh</em> - also mit Ubuntu 12.04 (und Lubuntu 12.04 sowie Ubuntu mit Gnome/Gnome Classic/Cinnamon) bin ich nicht zufrieden. Windows 7 hat tats&auml;chlich, ganz im Gegensatz zu allen Ubuntu-Arten, die Treiber CD ben&ouml;tigt. Naja.</p> <h2>Technische Daten</h2> <p><strong>Prozessor</strong>: Intel Pentium P6200 mit 2.13 GHz, 2 Kerne, 3 MB Cache (Quelle: <a href="http://ark.intel.com/products/50176/Intel-Pentium-Processor-P6200-3M-Cache-2_13-GHz">ark.intel.com</a>) <strong>Arbeitsspeicher</strong>: 4GB DDR3 (3704MiB laut lshw) <strong>Display</strong>: 15,6&quot; mit max. 1366px x 768px. Matt, LED LCD <strong>Grafikkarte</strong>: Intel HD Graphics (onboard) - Intel GMA HD <strong>Laufwerk</strong>: DVD-Super Multi DL drive <strong>LAN</strong>: NetLink BCM57780 Gigabit Ethernet PCIe, capacity: 1Gbit/s <strong>Gewicht</strong>: 2.5kg <strong>Akku</strong>: vermutlich 4.400 mAh <strong>Akkulaufzeit</strong>: 3.7 Std <strong>B x H x T</strong>: 38.1 cm x 2.57 - 3.38 cm x 25.3 cm <strong>Weiteres</strong>: <ul> <li>Acer Nplify 802.11b/g/n: <blockquote>Acer Nplify, a high-throughput wireless solution, delivers superior performance and reliable connections while enabling emerging voice, video and data applications.</blockquote> </li> <li>SD-Kartenleser</li> <li>3x USB 2.0</li> <li>2,5 kg</li> <li>DVD-Brenner ist irgendwie nicht so toll zu &ouml;ffnen. Das war beim 5735Z besser.</li> </ul></p> <h2>Linux Sorgenkinder</h2> <ul> <li><strong>Webcam</strong>: Funktioniert out of the box</li> <li><strong>WLAN</strong>: Funktioniert out of the box (WTF, ich kann bei mir das Uni-WLAN sehen!?! - Ein AR9485 Wireless Network Adapter von Atheros Communications Inc.)</li> <li><strong>Sound</strong>: Funktioniert out of the box (Lautsprecher und Buchse - die Lautsprecher sind nicht so toll, aber das ist bei einem Notebook ja zu erwarten)</li> <li><strong>Mikrofon</strong>: Sehr leise, funktioniert aber out of the box</li> </ul> <h2>Fazit</h2> <p>Tolles Low-Budget Notebook, das einwandfrei unter Linux (und Windows) funktioniert!</p> <p>Was ich gerne noch h&auml;tte (aber bei diesem Preis nicht erwarten darf): Bluetooth</p> <p>Ich habe auch direkt einen <a href="http://linuxhcl.com/browse/product?id=7811">Eintrag in die HCL</a> gemacht.</p> Java Puzzle #13: Absolute value weirdness http://martin-thoma.com/java-puzzle-13-absolute-value-weirdness Fri, 19 Oct 2012 15:00:00 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-13-absolute-value-weirdness <p>What does the following snippet output?</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">SomeClass</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="o">-</span><span class="mi">10</span><span class="o">;</span> <span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2147483648</span><span class="o">;</span> <span class="c1">// -2147483648 == -2**31</span> <span class="k">if</span> <span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">a</span><span class="o">)</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|a| &lt; -1&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|a| &gt;= -1&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">if</span> <span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">b</span><span class="o">)</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|b| &lt; -1&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|b| &gt;= -1&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|a| = &quot;</span> <span class="o">+</span> <span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">a</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|b| = &quot;</span> <span class="o">+</span> <span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">b</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="text">|a| &gt;= -1 |b| &lt; -1 |a| = 10 |b| = -2147483648 </code></pre></div> <h2>Explanation</h2> <p>Integer values range (in Java) from -2147483648 to 2147483647. This means, the absolute value of -2147483648 is not in the integer range. For more details, see <a href="http://stackoverflow.com/a/5444634/562769">this SO answer</a>.</p> Bürokratie am KIT http://martin-thoma.com/burokratie-am-kit Wed, 17 Oct 2012 16:06:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/burokratie-am-kit <p>Das KIT sieht sich gerne als Elite-Universit&auml;t.<sup>[<a href="http://www.kit.edu/besuchen/pi_2012_11933.php">1</a>]</sup> Es werden Rankings in Vorlesungen zitiert und erst vor kurzem wurde von einigen Professoren in der Vorlesung der Verlust des Status der Elite-Universit&auml;t betrauert.<sup>[<a href="http://bildungsklick.de/a/84162/hippler-elite-verlust-herber-rueckschlag-fuer-kit/">1</a>]</sup> Ich wei&szlig; nicht, was die Kriterien f&uuml;r eine Elite-Uni nach der Exzellenzinitiative sind, aber ich kann mir einige notwendige Voraussetzungen vorstellen, die f&uuml;r mich eine Elite-Uni ausmachen:</p> <ul> <li>Lehre <ul> <li>Vorlesungen, die anspruchsvollen Stoff gut strukturiert und aufbereitet vermitteln</li> <li>&Uuml;bungen, die den Stoff vertiefen und eventuell motivieren</li> <li>Tutorien, die offene Fragen beantworten und von kompetenten Tutoren gehalten werden</li> </ul> </li> <li>Forschung: Hier kann ich mir nicht anma&szlig;en, gute Kriterien aufstellen zu k&ouml;nnen, da ich selbst noch nicht daran beteiligt bin.</li> <li>Wirtschaft: vgl. Forschung</li> </ul> <p>Damit die Personen, die an Lehre, Forschung und in der Wirtschaft beteiligt sind gut arbeiten k&ouml;nnen, muss die Organisation reibungsfrei verlaufen. Mir ist klar, dass bei 22.552 Studierenden (Stand: M&auml;rz 2012) nicht immer alles reibungsfrei ablaufen kann. Auch der Bologna-Prozess scheint wohl immer noch Probleme nach sich zu ziehen. Aber f&uuml;r ein paar Probleme, die ich vor kurzem selbst erleben musste, habe ich kein Verst&auml;ndnis. Diese Probleme sind - so scheint es mir - b&uuml;rokratischer und organisatorischer Natur:</p> <h2>Studienb&uuml;ro</h2> <p>Das <a href="http://www.kit.edu/studieren/1960.php">Studienb&uuml;ro</a> hat folgende &Ouml;ffnungszeiten: <ul> <li>Mo-Mi: 10:00 - 12:00 Uhr</li> <li>Do: 13:30 - 15:30 Uhr</li> </ul></p> <p>Es hat also in der Woche nur 8 Stunden ge&ouml;ffnet. Ich war heute (Mittwoch) um 9:40 Uhr Studienb&uuml;ro und es war bereits eine Schlange von ca. 20 Leuten vor der T&uuml;r. Als p&uuml;nktlich um 10:00 Uhr der Eingang ge&ouml;ffnet wurde, reichte die Schlange bereits bis zum gegen&uuml;berliegenden Geb&auml;ude. Man muss nun beobachten, wie sich das im laufe des Semesters verh&auml;lt, aber es ist schon ein deutliches Indiz daf&uuml;r, dass hier entweder M&auml;ngel in der Organisation und Struktur des Studiums bzw. der damit verbundenen Software (z.B. QISPOS) vorliegen, oder zu wenig Personal vorhanden ist.</p> <h3>Schalter und Schlangen</h3> <p>Momentan sind Zettelrollen in verschiedenen Farben aufgestellt. Die Farben sind je nach Studiengang unterschiedlich. Auf jedem Zettel steht eine Nummer und diese wird aufgerufen. Dazu steht eine Frau an der T&uuml;r, ruft die Nummer und h&auml;lt die T&uuml;r auf. </p> <p>Ich wei&szlig; nicht ob diese Frau noch irgendetwas anderes macht, aber es scheint nicht der Fall zu sein. Wenn sie in dieser Zeit einen weiteren Schalter betreuen w&uuml;rde und das Aufrufen wie bei der Bahn oder im Finanzamt &uuml;ber eine elektronische Anzeige geschehen w&uuml;rde, h&auml;tte man vermutlich schon eine Effizienzsteigerung. Die aktuelle Nummer k&ouml;nnte man dann auch &uuml;ber einen Webdienst verf&uuml;gbar machen, sodass man in der Zwischenzeit auch etwas sinnvolleres machen kann.</p> <p>Nach ein paar Minuten wurde gefragt: &quot;Gibt es noch irgendjemanden der einen blauen Zettel hat?&quot;. Es gab niemanden. Was passiert dann? Ist eine Arbeitskraft dann unt&auml;tig, obwohl noch 50 Leute auf Hilfe / Antworten warten?</p> <h3>Freundlichkeit und Kompetenz</h3> <p>Als ich dann endlich im Studienb&uuml;ro zu meinem Schalter gekommen bin, konnte ich mein Problem vorstellen. Ich versuche das m&ouml;glichst wortw&ouml;rtlich wiederzugeben:</p> <ol> <li>Das Modul &quot;Algorithmen I&quot; war nicht als bestanden markiert, obwohl ich die Klausur &quot;Algorithmen I&quot; bestanden habe, diese auch als bestanden im System stand und es keine weiteren Voraussetzungen gibt. Das habe ich der Angestellten so gesagt. Angestellte: &bdquo;Da kann ich nichts machen, ich brauche erst ein Formular. Ohne Formular geht da nichts, da m&uuml;ssen sie zu Frau Gheta, ich muss 3 Schalter betreuen und habe daf&uuml;r keine Zeit.&ldquo;</li> </ol> <p>Was soll denn das? Ein kurzer Blick ins Modulhandbuch - ich konnte auch sagen an welcher Stelle - ein Blick auf meine Leistungen (die sie bereits aufgerufen hatte) und alles w&auml;re klar geweisen. Also habe ich das Problem nochmals beschrieben Ich: &bdquo;Ich habe alle Teile des Moduls bestanden, warum ist dann das Modul nicht als bestanden markiert?&ldquo; Sie schaut in ihr System und sagt mir, dass ich noch nicht alles aus der Theoretischen Informatik bestanden habe. Warum hat sie pl&ouml;tzlich mit theoretischer Informatik angefangen? Ich habe nichts von Theoretischer Informatik gesagt und mir ist klar, dass ich f&uuml;r das Fach noch nicht alles bestanden habe. Aber das hat doch nichts mit dem Modul zu tun.</p> <ol> <li>Obwohl ich die &Uuml;bungsscheine &bdquo;Lineare Algebra I&ldquo; und &bdquo;Lineare Algebra II&ldquo; f&uuml;r Mathematiker gemacht und bestanden habe, ist nur ein &Uuml;bungsschein &bdquo;Lineare Algebra I f&uuml;r die fachrichtung Informatik&ldquo; in QISPOS. Also sollte der &Uuml;bungsschein &bdquo;Lineare Algebra I f&uuml;r die fachrichtung Informatik&ldquo; in &bdquo;Lineare Algebra I&ldquo; umgewandelt werden und der &Uuml;bungsschein &bdquo;Lineare Algebra II&ldquo; hinzugef&uuml;gt werden. Ich habe beide Scheine in Papierform, vom Prof. unterschrieben, dabei gehabt und ihr gegeben. Angestellte legt die beiden &Uuml;bungsschein-Best&auml;tigungen auf einen Ablagestapel Angestellte: &bdquo;Daf&uuml;r ben&ouml;tigen sie eine Best&auml;tigung.&ldquo; Ich: &bdquo;Aber ich habe Ihnen doch gerade die Best&auml;tigung gegeben?!?&ldquo; Angestellte: &bdquo;F&uuml;r eine Ummeldung muss ein anderes Formular ausgef&uuml;llt werden. Ich kann so nur die &Uuml;bungsscheine hinzuf&uuml;gen.&ldquo; Na gut, dann habe ich nun wohl einen &Uuml;bungsschein zu viel ... Nach ein bisschen Diskutieren meint sie, ich h&auml;tte wegen HM bereits einen Antrag gemacht. Ich habe niemals HM besucht und hatte bisher auch keine Probleme wegen HM vs. Analysis. Hoffentlich kommt das jetzt nicht dazu ...</li> </ol> <p>Insgesamt muss ich sagen, wurde ich unfreundlich behandet - ich hatte das Gef&uuml;hl, direkt wieder rausgeworfen zu werden - und die Frau hat mir nicht zugeh&ouml;rt. Kurz darauf bin ich zum &bdquo;Servicezentrum f&uuml;r Studium und Lehre&ldquo; gegangen. Dort hat mir Frau Metzig geholfen. Sie hat mein Problem verstanden. Nach wenigen Minuten, ohne langes Anstehen oder irgendwelche Formulare hat sie mir versichert, dass Sie sich um das Problem in den n&auml;chsten zwei Tagen k&uuml;mmert. Schon nach 2 Stunden kam eine E-Mail an, in der sie mir mitteilte, dass es ein Systemfehler war. Mein Problem ist nun behoben.</p> <h2>QISPOS</h2> <p>QISPOS ist ein System von der <a href="http://de.wikipedia.org/wiki/Hochschul-Informations-System">HIS Hochschul-Informations-System GmbH</a>, das am KIT f&uuml;r die Pr&uuml;fungsverwaltung eingesetzt wird. Das bedeutet, hier meldet man sich an und ab, kann Noten und bestandene Module nachschauen. Auch Voraussetzungen f&uuml;r andere Module wie z.B. PSE werden hiermit &uuml;berpr&uuml;ft.</p> <p>Dieses System muss ziemlich schwere Voraussetzungen erf&uuml;llen: Es muss funktionieren. Immer. Leider ist das nicht der Fall:</p> <ul> <li>Pr&uuml;fungsanmeldungen klappen nicht. Es werden fehlende Voraussetzungen angezeigt, obwohl es keine Voraussetzungen gibt (ist mir mit Algorithmen passiert)</li> <li>Die Anmeldung f&uuml;r manche Module ist nicht m&ouml;glich, obwohl sie laut Modulhandbuch m&ouml;glich ist (z.B. Physiker und Mathe)</li> <li>Sonstige Systemfehler kommen vor: Das Modul Algorithmen wurde bei mir nicht als bestanden markiert, obwohl es offensichtlich bestanden war.</li> </ul> <p>Das sind jetzt nur ein paar Fehler, die mir pers&ouml;nlich passiert sind. Es gibt bestimmt noch mehr. Und von unsch&ouml;nen Dingen wie langen Ladezeiten, einer schlechten Men&uuml;f&uuml;hrung oder einer fehlenden Suchfunktion will ich mal gar nicht reden. </p> <p>Da frage ich mich schon, was das KIT daf&uuml;r bezahlt. Einfach gesagt, sehe ich zwei M&ouml;glichkeiten: <ol> <li>Es wird sehr wenig bezahlt: Dann ist es kein Wunder, dass diese Probleme auftreten. Dann sollte man sich &uuml;berlegen, ob es nicht sinnvoll w&auml;re, mehr zu investieren</li> <li>Man zahlt angemessen / viel f&uuml;r die geforderten Eigenschaften: In diesem Fall sollte man sich nach einem anderem Anbieter umsehen oder selbst eine Entwicklung starten.</li> </ol></p> <p>Ehrlich gesagt wundert es mich, dass es hierf&uuml;r keine Uni-Eigene L&ouml;sung gibt. Gibt es OpenSource in diesem Bereich?</p> <h2>H&auml;ufige Probleme - FAQ</h2> <p>Als ich gewartet habe, sind mir zwei h&auml;ufige Probleme aufgefallen: <ul> <li>Defekte KIT-Card</li> <li>Keine Matrikelnummer</li> </ul></p> <p>Eine defekte KIT-Card sollte einfach &uuml;ber ein Online-Formular nachbestellbar sein. Ich sehe keinen Grund, warum man dazu in das Studienb&uuml;ro gehen sollte.</p> <p>Wenn jetzt, nach beginn der Vorlesungszeit, noch keine Matrikelnummer vorhanden ist, l&auml;uft irgendwas schief. Da es bei vielen der Fall ist, kann es nicht an den Studenten liegen. Entweder wurden bestimmte voraussetzungen nicht deutlich genug gemacht (&agrave; la: Es muss Formular XY zur&uuml;ckgeschickt werden, bevor eine Matrikelnummer ausgestellt wird), oder es der Prozess eine Matrikelnummer zu erstellen dauert zu lange. Falls das zu lange dauert, kann man entweder den Prozessablauf beschleunigen, oder mehr Personal einstellen.</p> <p>Eine einfache FAQ-Liste auf der Seite des Studienb&uuml;ros k&ouml;nnte schon helfen.</p> <p>So, jetzt habe ich einige Stunden mit B&uuml;rokratie, Organisation und diesem Bericht dar&uuml;ber verbacht und etwas Frust abgebaut. Zeit, die ich in mein Studium h&auml;tte stecken k&ouml;nnen. Vielleicht liest es ja jemand, der etwas &auml;ndern kann.</p> <p>Habt ihr &auml;hnliche Geschichten mit dem Studienb&uuml;ro erlebt? Habt ihr Verbesserungsvorschl&auml;ge? Dann hinterlasst doch einfach einen Kommentar.</p> Java Puzzle #12: Control-flow http://martin-thoma.com/java-puzzle-12-control-flow Wed, 17 Oct 2012 15:00:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-12-control-flow <p>What is the output of the following <strong>HelloWorld.java</strong>?</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">HelloWorld</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="mi">2</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="o">);</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Yes&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . .</p> <h2>Answer</h2> <p>The output is &quot;Yes&quot;. </p> <h2>Explanation</h2> <p>The <code>;</code> means, that no block is executed. The <code>{ ... }</code> is just a code block and not really related to the <code>if</code>-statement.</p> Learning Java http://martin-thoma.com/learning-java Mon, 15 Oct 2012 15:00:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/learning-java <p>I&#39;ve just found some YouTube clips by <a href="http://www.youtube.com/user/thenewboston">thenewboston</a> in which he explains how to program in Java. I didn&#39;t watch them, but I took a look at some of them. Seems to be very easy to understand.</p> <p>He starts right from the beginning (that means: how do I install Java?) explains basic concepts like variables, program flow statements and user input and goes to GUI with Swing: <iframe width="512" height="288" src="http://www.youtube.com/embed/videoseries?list=PLFE2CE09D83EE3E28&amp;hl=en_US" frameborder="0" allowfullscreen></iframe></p> <h2>See also</h2> <ul> <li><a href="http://www.youtube.com/playlist?list=PLA68C1F33757B4A38">C++ Beginner Tutorial</a>: 54 Videos on YouTube from XoaX.net</li> <li><a href="http://www.youtube.com/playlist?list=PLA68C1F33757B4A38">C++ OpenGL Beginner Tutorials</a>: 54 Videos from XoaX.net</li> </ul> Java Puzzle #11: Change argument of foreach http://martin-thoma.com/java-puzzle-11-change-argument-of-foreach Sun, 14 Oct 2012 19:15:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-11-change-argument-of-foreach <p>What is the output of the following HelloWorld.java?</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">HelloWorld</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="n">Integer</span> <span class="n">el</span> <span class="o">:</span> <span class="n">list</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">el</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">el</span><span class="o">);</span> <span class="n">i</span><span class="o">++;</span> <span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">20</span><span class="o">)</span> <span class="o">{</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="java"><span class="mi">1</span> <span class="n">Exception</span> <span class="n">in</span> <span class="n">thread</span> <span class="s">&quot;main&quot;</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">ConcurrentModificationException</span> <span class="n">at</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">LinkedList</span><span class="err">`</span><span class="n">$ListItr</span><span class="o">.</span><span class="na">checkForComodification</span><span class="o">(</span><span class="n">LinkedList</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">761</span><span class="o">)</span> <span class="n">at</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">LinkedList</span><span class="n">$</span><span class="err">`</span><span class="n">ListItr</span><span class="o">.</span><span class="na">next</span><span class="o">(</span><span class="n">LinkedList</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">696</span><span class="o">)</span> <span class="n">at</span> <span class="n">HelloWorld</span><span class="o">.</span><span class="na">main</span><span class="o">(</span><span class="n">HelloWorld</span><span class="o">.</span><span class="na">java</span><span class="o">:</span><span class="mi">10</span><span class="o">)</span> </code></pre></div> Manipulating PDF files http://martin-thoma.com/manipulating-pdf-files Sat, 13 Oct 2012 08:24:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/manipulating-pdf-files <p>I just wanted to get some pages out of a bigger PDF file. The tool that can be used for this task is called <code>pdftk</code>. It is in the standard Ubuntu repsitory.</p> <h2>Usage</h2> <p>Split the file, so that every page becomes a new PDF file:</p> <div class="highlight"><pre><code class="bash">pdftk myfile.pdf burst </code></pre></div> <p>Extract pages 10 to 12 from <tt>bigPDF.pdf</tt>:</p> <div class="highlight"><pre><code class="bash">pdftk bigPDF.pdf cat 10-12 output output.pdf </code></pre></div> Java Generics http://martin-thoma.com/java-generics Wed, 10 Oct 2012 10:18:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-generics <p>Some months ago, I had to improve some Java code for university. They gave us a model of a windows like file system and we had to make the code &quot;cleaner&quot;. I think I&#39;ve overdone the application of generics, but it&#39;s a nice example for generics ;-)</p> <p>You can download the <a href="../images/2012/10/Filesystem.zip">complete Eclipse project</a>.</p> <h2>Computer.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Vector</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Computer</span> <span class="o">{</span> <span class="kd">public</span> <span class="n">String</span> <span class="n">computerName</span><span class="o">;</span> <span class="kd">public</span> <span class="n">Vector</span><span class="o">&lt;</span><span class="n">HDD</span><span class="o">&gt;</span> <span class="n">hdds</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Vector</span><span class="o">&lt;</span><span class="n">HDD</span><span class="o">&gt;();</span> <span class="kd">public</span> <span class="nf">Computer</span><span class="o">(</span><span class="n">String</span> <span class="n">companyName</span><span class="o">,</span> <span class="n">HDD</span> <span class="n">gf</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">computerName</span> <span class="o">=</span> <span class="n">companyName</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">hdds</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">gf</span><span class="o">);</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">addDrive</span><span class="o">(</span><span class="n">HDD</span> <span class="n">drive</span><span class="o">)</span> <span class="o">{</span> <span class="n">hdds</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">drive</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">printContent</span><span class="o">()</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="n">HDD</span> <span class="n">hdd</span> <span class="o">:</span> <span class="n">hdds</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;| HDD: &quot;</span> <span class="o">+</span> <span class="n">hdd</span><span class="o">.</span><span class="na">getName</span><span class="o">()</span> <span class="o">+</span> <span class="s">&quot; (&quot;</span> <span class="o">+</span> <span class="n">hdd</span><span class="o">.</span><span class="na">getDescription</span><span class="o">()</span> <span class="o">+</span> <span class="s">&quot;)&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">Directory</span> <span class="n">dir</span> <span class="o">:</span> <span class="n">hdd</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">Directory</span><span class="o">.</span><span class="na">class</span><span class="o">))</span> <span class="o">{</span> <span class="n">printContent</span><span class="o">(</span><span class="n">dir</span><span class="o">,</span> <span class="s">&quot;&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">for</span> <span class="o">(</span><span class="n">ZipArchiv</span> <span class="n">zip</span> <span class="o">:</span> <span class="n">hdd</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">ZipArchiv</span><span class="o">.</span><span class="na">class</span><span class="o">))</span> <span class="o">{</span> <span class="n">printContent</span><span class="o">(</span><span class="n">zip</span><span class="o">,</span> <span class="s">&quot;&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">f</span> <span class="o">:</span> <span class="n">hdd</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">File</span><span class="o">.</span><span class="na">class</span><span class="o">))</span> <span class="o">{</span> <span class="n">printContent</span><span class="o">(</span><span class="n">f</span><span class="o">,</span> <span class="s">&quot;|-&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">printContent</span><span class="o">(</span><span class="n">Node</span> <span class="n">d</span><span class="o">,</span> <span class="n">String</span> <span class="n">ident</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;|-&quot;</span> <span class="o">+</span> <span class="n">ident</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">d</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Class</span><span class="o">&lt;?</span> <span class="kd">extends</span> <span class="n">Node</span><span class="o">&gt;&gt;</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Class</span><span class="o">&lt;?</span> <span class="kd">extends</span> <span class="n">Node</span><span class="o">&gt;&gt;();</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">Directory</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">ZipArchiv</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">File</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">d</span> <span class="k">instanceof</span> <span class="n">NodeContainer</span><span class="o">)</span> <span class="o">{</span> <span class="n">NodeContainer</span> <span class="n">e</span> <span class="o">=</span> <span class="o">(</span><span class="n">NodeContainer</span><span class="o">)</span> <span class="n">d</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="n">Class</span><span class="o">&lt;?</span> <span class="kd">extends</span> <span class="n">Node</span><span class="o">&gt;</span> <span class="n">T</span> <span class="o">:</span> <span class="n">list</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;?</span> <span class="kd">extends</span> <span class="n">Node</span><span class="o">&gt;</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">T</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">Node</span> <span class="n">n</span> <span class="o">:</span> <span class="n">tmp</span><span class="o">)</span> <span class="o">{</span> <span class="n">printContent</span><span class="o">(</span><span class="n">n</span><span class="o">,</span> <span class="n">ident</span> <span class="o">+</span> <span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Create the computer</span> <span class="n">HDD</span> <span class="n">platte1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HDD</span><span class="o">(</span><span class="s">&quot;C&quot;</span><span class="o">,</span> <span class="s">&quot;Main disk&quot;</span><span class="o">);</span> <span class="n">Computer</span> <span class="n">f</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Computer</span><span class="o">(</span><span class="s">&quot;MyMainComputer&quot;</span><span class="o">,</span> <span class="n">platte1</span><span class="o">);</span> <span class="c1">// we need a backup</span> <span class="n">HDD</span> <span class="n">platte2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HDD</span><span class="o">(</span><span class="s">&quot;D&quot;</span><span class="o">,</span> <span class="s">&quot;Backup disk&quot;</span><span class="o">);</span> <span class="n">f</span><span class="o">.</span><span class="na">addDrive</span><span class="o">(</span><span class="n">platte2</span><span class="o">);</span> <span class="c1">// create main directories</span> <span class="n">Directory</span> <span class="n">v1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Directory</span><span class="o">(</span><span class="s">&quot;temp&quot;</span><span class="o">,</span> <span class="s">&quot;temporary files&quot;</span><span class="o">);</span> <span class="n">platte1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">v1</span><span class="o">);</span> <span class="n">v1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">Directory</span><span class="o">(</span><span class="s">&quot;asdf&quot;</span><span class="o">,</span> <span class="s">&quot;jkl&amp;ouml;&quot;</span><span class="o">));</span> <span class="n">Directory</span> <span class="n">v2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Directory</span><span class="o">(</span><span class="s">&quot;Pictures&quot;</span><span class="o">,</span> <span class="s">&quot;Holiday pictures&quot;</span><span class="o">);</span> <span class="n">platte1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">v2</span><span class="o">);</span> <span class="c1">// Gib den Verzeichnissen ein paar Inhalte</span> <span class="c1">// Ein paar Archive im Temp</span> <span class="n">ZipArchiv</span> <span class="n">zip1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ZipArchiv</span><span class="o">(</span><span class="s">&quot;fp-update.zip&quot;</span><span class="o">,</span> <span class="s">&quot;Flashplayer Update&quot;</span><span class="o">);</span> <span class="n">v1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">zip1</span><span class="o">);</span> <span class="n">ZipArchiv</span> <span class="n">zip2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ZipArchiv</span><span class="o">(</span><span class="s">&quot;swt1-folien.zip&quot;</span><span class="o">,</span> <span class="s">&quot;PDFs of SWT1&quot;</span><span class="o">);</span> <span class="n">v1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">zip2</span><span class="o">);</span> <span class="c1">// pictures</span> <span class="n">ZipArchiv</span> <span class="n">barcelona</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ZipArchiv</span><span class="o">(</span><span class="s">&quot;2010-Barcelona.zip&quot;</span><span class="o">,</span> <span class="s">&quot;Holiday Barcelona 2010&quot;</span><span class="o">);</span> <span class="n">v2</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">barcelona</span><span class="o">);</span> <span class="n">ZipArchiv</span> <span class="n">mallorca</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ZipArchiv</span><span class="o">(</span><span class="s">&quot;2011-Mallorca.zip&quot;</span><span class="o">,</span> <span class="s">&quot;Sonne satt&quot;</span><span class="o">);</span> <span class="n">v2</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">mallorca</span><span class="o">);</span> <span class="n">v2</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;ipdlogo.png&quot;</span><span class="o">,</span> <span class="s">&quot;IPD&quot;</span><span class="o">));</span> <span class="c1">// add some files to archives</span> <span class="n">ZipArchiv</span> <span class="n">b1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ZipArchiv</span><span class="o">(</span><span class="s">&quot;BarcelonaBeach.zip&quot;</span><span class="o">,</span> <span class="s">&quot;Strandbilder&quot;</span><span class="o">);</span> <span class="n">barcelona</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">b1</span><span class="o">);</span> <span class="n">b1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;s1.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Strand&quot;</span><span class="o">));</span> <span class="n">b1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;s2.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Mehr Strand&quot;</span><span class="o">));</span> <span class="n">b1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;s3.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Strand und Meer&quot;</span><span class="o">));</span> <span class="n">b1</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;s4.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Noch mehr Strand&quot;</span><span class="o">));</span> <span class="n">File</span> <span class="n">b2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;Picasso.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Museum&quot;</span><span class="o">);</span> <span class="n">barcelona</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">b2</span><span class="o">);</span> <span class="n">File</span> <span class="n">b3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;SagradaFamilia.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Kirche&quot;</span><span class="o">);</span> <span class="n">barcelona</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">b3</span><span class="o">);</span> <span class="n">File</span> <span class="n">b4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;CampNou.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Fu&amp;szlig;ball&quot;</span><span class="o">);</span> <span class="n">barcelona</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">b4</span><span class="o">);</span> <span class="n">File</span> <span class="n">m1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">&quot;Strand.jpg&quot;</span><span class="o">,</span> <span class="s">&quot;Strand&quot;</span><span class="o">);</span> <span class="n">mallorca</span><span class="o">.</span><span class="na">addNode</span><span class="o">(</span><span class="n">m1</span><span class="o">);</span> <span class="n">f</span><span class="o">.</span><span class="na">printContent</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Node.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Node</span> <span class="o">{</span> <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span> <span class="kd">private</span> <span class="n">String</span> <span class="n">description</span><span class="o">;</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">getName</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">name</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setName</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="n">String</span> <span class="nf">getDescription</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">description</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setDescription</span><span class="o">(</span><span class="n">String</span> <span class="n">description</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">description</span> <span class="o">=</span> <span class="n">description</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>NodeContainer.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">interface</span> <span class="nc">NodeContainer</span> <span class="o">{</span> <span class="kd">public</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">get</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">clazz</span><span class="o">);</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">addNode</span><span class="o">(</span><span class="n">Node</span> <span class="n">n</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <h2>HDD.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">HDD</span> <span class="kd">extends</span> <span class="n">Node</span> <span class="kd">implements</span> <span class="n">NodeContainer</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;();</span> <span class="kd">public</span> <span class="nf">HDD</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">beschreibung</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">name</span><span class="o">);</span> <span class="k">this</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="n">beschreibung</span><span class="o">);</span> <span class="o">}</span> <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">&quot;unchecked&quot;</span><span class="o">)</span> <span class="kd">public</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">get</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">allElements</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;();</span> <span class="k">for</span><span class="o">(</span><span class="n">Node</span> <span class="n">o</span> <span class="o">:</span> <span class="n">nodes</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">o</span><span class="o">.</span><span class="na">getClass</span><span class="o">()</span> <span class="o">==</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">allElements</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="n">T</span><span class="o">)</span> <span class="n">o</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">allElements</span><span class="o">;</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">addNode</span><span class="o">(</span><span class="n">Node</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="n">nodes</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">n</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Directory.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Directory</span> <span class="kd">extends</span> <span class="n">Node</span> <span class="kd">implements</span> <span class="n">NodeContainer</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;();</span> <span class="kd">public</span> <span class="nf">Directory</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">description</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">name</span><span class="o">);</span> <span class="k">this</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="n">description</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">addNode</span><span class="o">(</span><span class="n">Node</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="n">nodes</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">n</span><span class="o">);</span> <span class="o">}</span> <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">&quot;unchecked&quot;</span><span class="o">)</span> <span class="kd">public</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">get</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">allElements</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;();</span> <span class="k">for</span><span class="o">(</span><span class="n">Node</span> <span class="n">o</span> <span class="o">:</span> <span class="n">nodes</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">o</span><span class="o">.</span><span class="na">getClass</span><span class="o">()</span> <span class="o">==</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">allElements</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="n">T</span><span class="o">)</span> <span class="n">o</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">allElements</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>ZipArchiv.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">ZipArchiv</span> <span class="kd">extends</span> <span class="n">File</span> <span class="kd">implements</span> <span class="n">NodeContainer</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;();</span> <span class="kd">public</span> <span class="nf">ZipArchiv</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">description</span><span class="o">)</span> <span class="o">{</span> <span class="kd">super</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="n">description</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">addNode</span><span class="o">(</span><span class="n">Node</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="n">nodes</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">n</span><span class="o">);</span> <span class="o">}</span> <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">&quot;unchecked&quot;</span><span class="o">)</span> <span class="kd">public</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">get</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">allElements</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;();</span> <span class="k">for</span><span class="o">(</span><span class="n">Node</span> <span class="n">o</span> <span class="o">:</span> <span class="n">nodes</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">o</span><span class="o">.</span><span class="na">getClass</span><span class="o">()</span> <span class="o">==</span> <span class="n">clazz</span><span class="o">)</span> <span class="o">{</span> <span class="n">allElements</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="n">T</span><span class="o">)</span> <span class="n">o</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">allElements</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>File.java</h2> <div class="highlight"><pre><code class="java"><span class="kn">package</span> <span class="n">edu</span><span class="o">.</span><span class="na">kit</span><span class="o">.</span><span class="na">filesystem</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">File</span> <span class="kd">extends</span> <span class="n">Node</span> <span class="o">{</span> <span class="kd">public</span> <span class="nf">File</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">beschreibung</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="n">name</span><span class="o">);</span> <span class="k">this</span><span class="o">.</span><span class="na">setDescription</span><span class="o">(</span><span class="n">beschreibung</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> Balanzan Theme http://martin-thoma.com/balanzan-theme Tue, 09 Oct 2012 16:20:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/balanzan-theme <p>I don&#39;t understand why all desktop environment seem to lack a good theme chooser/editor and good themes. I have one favorite theme - called &quot;<a href="http://www.bisigi-project.org/?p=28&lang=en">Balanzan Theme</a>&quot; which should be available in every distribution. The Balanzan Theme is part of the <a href="http://www.bisigi-project.org/?lang=en">bisigi-project</a>. According to <a href="https://launchpad.net/~bisigi/+archive/ppa/+files/balanzan-theme_1.8.1.natty.ppa1.tar.gz">the package</a>, it is licensed under GPL. So I think I can upload some of its content here.</p> <h2>Installation</h2> <div class="highlight"><pre><code class="bash">sudo add-apt-repository ppa:bisigi sudo apt-get update sudo apt-get install bisigi-themes </code></pre></div> <h2>Impression</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/10/balazan-font-300x247.png"><img src="../images/2012/10/balazan-font-300x247.png" alt="" width="300" height="247" class="size-medium wp-image-46561"/></a><p class="wp-caption-text"></p></div> <h2>Color Theme</h2> <h3>LXDE</h3> <table class="wikitable"> <tr> <th>&nbsp;</th> <th>Background</th> <th>Foreground</th> </tr> <tr> <th>Normal windows:</th> <td style="background-color:#F5EDD8">#F5EDD8</td> <td style="background-color:#101010">#101010</td> </tr> <tr> <th>Text windows:</th> <td style="background-color:#FFF">#FFF</td> <td style="background-color:#1A1A1A">#1A1A1A</td> </tr> <tr> <th>Selected items:</th> <td style="background-color:#F4C256">#F4C256</td> <td style="background-color:#1A1A1A">#1A1A1A</td> </tr> <tr> <th>Tooltips:</th> <td style="background-color:#F5F5B5">#F5F5B5</td> <td style="background-color:#000">#000</td> </tr> </table> <h2>Icon Theme</h2> <p>Download <a href="https://launchpad.net/~bisigi/+archive/ppa/+files/balanzan-theme_1.8.1.natty.ppa1.tar.gz">the whole package</a>, go to <code>balazan-theme/icons</code> and look into <code>balazan.tar.bz2</code>.</p> <p>Here are some of the icons: <div style="width: 459px" class="wp-caption aligncenter"><a href="../images/2012/10/balazan-icons.png"><img src="../images/2012/10/balazan-icons.png" alt="" width="459" height="465" class="size-full wp-image-46541"/></a><p class="wp-caption-text"></p></div></p> <h2>Background</h2> <p>The background is based on &quot;<a href="http://ubuntu.damianvila.com/">Lion Claar</a>&quot; background by Dami&aacute;n Vila:</p> <div style="width: 150px" class="wp-caption alignright"><a href="../images/2012/10/balanzan_4_3-150x150.png"><img src="../images/2012/10/balanzan_4_3-150x150.png" alt="" width="150" height="150" class="size-thumbnail wp-image-46491"/></a><p class="wp-caption-text"></p></div> <div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2012/10/balanzan-150x150.png"><img src="../images/2012/10/balanzan-150x150.png" alt="" width="150" height="150" class="size-thumbnail wp-image-46481"/></a><p class="wp-caption-text"></p></div> PSE am KIT http://martin-thoma.com/pse-am-kit Sun, 07 Oct 2012 14:09:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/pse-am-kit <p>Da es zum Modul &bdquo;Praxis der Software-Entwicklung&ldquo; vom KIT leider nur verstreut Informationen gibt (die noch dazu teilweise veraltet sind) versuche ich mal f&uuml;r das Wintersemester 2012/2013 ein paar Informationen zu sammeln und darzustellen.</p> <h2>Allgemeines</h2> <ul> <li>max 10k LOC (Java / C++ / C#)</li> <li>2 `$\frac{\text{Tage}}{\text{Woche} \cdot \text{Teilnehmer}}$` sollte man einplanen (offiziell)</li> <li>Tools wollen sie sehen: Eclipse, GUI-Builder, JMetrics, Rational Architect, JCov</li> <li>Bis 18. November: Anmeldung in studium.kit.edu f&uuml;r PSE und Teamarbeit in der Software-Entwicklung</li> </ul> <h2>Modulhandbuch: PSE</h2> <p>Das Modul PSE wird als IN2INSWP bezeichnet und auf S. 37 beschrieben. Es findet <em>jedes Semester</em> statt und ist 6 ECTS-Punkte wert.</p> <h3>Erfolgskontrolle</h3> <blockquote>Die Erfolgskontrolle erfolgt nach &sect; 4 Abs. 2 Nr. 3 SPO als benotete Erfolgskontrolle anderer Art. Die in den Anmerkungen genannten Artefakte werden separat benotet und gehen mit folgendem Prozentsatz in die Gesamtnote ein: <ul> <li>Pflichtenheft 10%</li> <li>Entwurf 30%</li> <li>Implementierung 30%</li> <li>Qualit&auml;tssicherung 20%</li> <li>Abschlusspr&auml;sentation 10%</li> </ul></blockquote> <h3>Bedingungen</h3> <blockquote>Das Modul muss zusammen mit dem Modul Teamarbeit in der Software-Entwicklung [IN2INSWPS] belegt werden. Der erfolgreiche Abschluss der Module Grundbegriffe der Informatik [IN1INGI], Programmieren [IN1INPROG] und Softwaretechnik I [IN1INSWT1] wird vorausgesetzt.</blockquote> <h3>Lernziele</h3> <blockquote>Die Teilnehmer lernen, ein vollst&auml;ndiges Softwareprojekt nach dem Stand der Softwaretechnik in einem Team mit ca. 5-7 Teilnehmern durchzuf&uuml;hren. Ziel ist es insbesondere, Verfahren des Software-Entwurfs und der Qualit&auml;tssicherung praktisch einzusetzen, Implementierungskompetenz umzusetzen, und arbeitsteilig im Team zu kooperieren.</blockquote> <h3>Inhalt</h3> <blockquote><ul><li>Erstellung des Pflichtenheftes incl. Verwendungsszenarien</li> <li>Objektorientierter Entwurf nebst Feinspezifikation</li> <li>Implementierung in einer objektorientierten Sprache</li> <li>Funktionale Tests und &Uuml;berdeckungstests</li> <li>Einsatz von Werkzeugen (z.B. Eclipse, UML, Java, Junit, Jcov)</li> <li>Pr&auml;sentation des fertigen Systems</li></ul></blockquote> <h3>Anmerkungen</h3> <blockquote><strong>Zur Struktur</strong>: Das Praktikum gliedert sich in die Phasen Pflichtenheft, Entwurf und Feinspezifikation, Implementierung, Qualit&auml;tssicherung, Abschlusspr&auml;sentation. Alle Phasen werden nach dem Stand der Softwaretechnik objektorientiert und werkzeugunterst&uuml;tzt durchgef&uuml;hrt. Zu jeder Phase muss das entsprechende Artefakt (Pflichtenheft, UML-Diagramme mit Erl&auml;uterungen, vollst&auml;ndiger Java-Quellcode, Testprotokolle, laufendes System) in einem Kolloquium pr&auml;sentiert werden. Das vollst&auml;ndige System wird von den Betreuern auf Funktionalit&auml;t, Bedienbarkeit und Robustheit gepr&uuml;ft.</blockquote> <h2>Modulhandbuch: Teamarbeit in der Software-Entwicklung</h2> <p>Das Modul &bdquo;Teamarbeit in der Software-Entwicklung&ldquo; wird als IN2INSWPS auf S. 39 des Modulhandbuchs beschrieben. Es ist 2 ECTS-Punkte wert und besteht aus nur einer Lehrveranstaltung (Teamarbeit und Pr&auml;sentation in der Software-Entwicklung, S. 402)</p> <h3>Erfolgskontrolle</h3> <blockquote>Die Erfolgskontrolle erfolgt als benotete Erfolgskontrolle anderer Art nach &sect; 4 Abs. 2 Nr. 3 SPO. Teilnehmer m&uuml;ssen als Team von ca. 5 Studierenden Pr&auml;sentationen zu den Software-Entwicklungsphasen Pflichtenheft, Entwurf, Implementierung, Qualit&auml;tssicherung sowie eine Abschlusspr&auml;sentation von je 15 Minuten erarbeiten. Teilnehmer m&uuml;ssen Dokumente zur Projektplanung, insbesondere Qualit&auml;tssicherungsplan und Implementierungsplan vorlegen und umsetzen.</blockquote> <h3>Bedinungen</h3> <blockquote>Das Modul kann nur in Verbindung mit dem Modul Praxis der Software-Entwicklung [IN2INSWP] absolviert werden. Der erfolgreiche Abschluss der Module Grundbegriffe der Informatik [IN1INGI] und Programmieren [IN1INPROG] wird vorausgesetzt.</blockquote> <h3>Lernziele</h3> <blockquote>Die Teilnehmer erwerben wichtige nicht-technische Kompetenzen zur Durchf&uuml;hung von Softwareprojekten im Team. Dazu geh&ouml;ren Sprachkompetenz und kommunikative Kompetenz sowie Techniken der Teamarbeit, der Pr&auml;sentation und der Projektplanung.</blockquote> <h3>Inhalt</h3> <blockquote>Auseinandersetzung mit der Arbeit im Team, Kommunikations-, Organisations- und Konfliktbehandungsstrategien; Erarbeitung von Pr&auml;sentationen zu Pflichtenheft, Entwurf, Implementierung, Qualit&auml;tssicherung, Abschlusspr&auml;sentation; Projektplanungstechniken (z.B. Netzplantechnik, Phasenbeauftragte).</blockquote> <h3>Anmerkungen</h3> <blockquote>Dieses Modul erg&auml;nzt das Pflichtmodul Praxis der Software-Entwicklung [IN2INSWP]. Es ist ein Pflichtmodul. Studierende, die die Schl&uuml;sselqualifikationen bereits in vollem Umfang vorliegen, aber das Modul Praxis der Software-Entwicklung [IN2INSWP] noch nicht bestanden haben, kontaktieren bitte das Service-Zentrum Studium und Lehre.</blockquote> <h2>WebInscribe</h2> <p>Man meldet sich vermutlich bald unter <a href="https://webinscribe.ira.uka.de/pse2012">webinscribe.ira.uka.de/pse2012</a> an.</p> <h2>Termine</h2> <p><a href="http://pp.info.uni-karlsruhe.de/lehre/WS201213/pse/">Diese Seite</a> bietet ein paar weitere Informationen:</p> <p><strong>Auftaktveranstaltung</strong>: Montag, 15.10.2012 um 15:45 Uhr im Audimax <strong>Bis 18. November</strong>: Anmeldung in studium.kit.edu f&uuml;r PSE <strong>und</strong> Teamarbeit in der Software-Entwicklun</p> <h2>Themen</h2> <p>Sind unter &bdquo;<a href="http://pp.info.uni-karlsruhe.de/lehre/WS201213/pse/">Aufgabenstellungen</a>&ldquo; zu finden und ein paar davon hier nochmals mit Links:</p> <table class="wikitable"> <tr> <th>&nbsp;</th> <th>Name</th> <th>Teams</th> <th>#, LV-Nr.</th> </tr> <tr> <td>TM <a href="http://www.cm-tm.uka.de/staff_abeck.php">Abeck</a></td> <td><a href="http://cm.tm.kit.edu/study_pse.php">CampusCoach - Entwicklung eines Web-basierten Coaching-Systems</a></td> <td>1</td> <td>1, 24041</td> </tr> <tr> <td>IFA <a href="http://wwwiaim.ira.uka.de/users/asfour/">Asfour</a></td> <td>Teleoperating eines humanoiden Roboters mit einem Android Tablet</td> <td>1</td> <td>#</td> </tr> <tr> <td>ITI Beckert</td> <td><a href="http://formal.iti.kit.edu/teaching/pse/2012/">Automatisches Pr&uuml;fen von Programmeigenschaften</a></td> <td>2</td> <td>#</td> </tr> <tr> <td><a href="http://pcs.tm.kit.edu/21_beigl.php">TM Beigl</a></td> <td><a href="http://pcs.tm.kit.edu/320_330.php">Point and Click - Steuerung von Intelligenten Umgebungen mit Android und Kinect</a></td> <td>4</td> <td>#</td> </tr> <tr> <td rowspan="2">IOSB Beyerer</td> <td>Steuerung mobiler Roboter im vermischten Windows-Linux Netzwerk &uuml;ber ROS-Middleware</td> <td>1</td> <td>#</td> </tr> <tr> <td>Multispektrale Datenbank</td> <td>1</td> <td>#</td> </tr> <tr> <td rowspan="3">IPD <a href="http://dbis.ipd.uni-karlsruhe.de/336.php">B&ouml;hm</a></td> <td><a href="http://dbis.ipd.uni-karlsruhe.de/1942.php">Ein lokaler Energiemarktplatz f&uuml;r das Smart Grid</a></td> <td>2</td> <td>#</td> </tr> <tr> <td>Management personenbezogener Daten in Crowdsourcing-Szenarien</td> <td>2</td> <td>#</td> </tr> <tr> <td>Generating Meaningful Statistics on Access Behavior to Scientific Data Bases</td> <td>2</td> <td>#</td> </tr> <tr> <td>IBDS <a href="http://cg.ibds.kit.edu/dachsbacher/index.php">Dachsbacher</a></td> <td><a href="http://cg.ibds.kit.edu/lehre/ws2012/pse/index.php">Echtzeitcomputergrafik in der Spieleentwicklung</a></td> <td>2</td> <td>#</td> </tr> <tr> <td><a href="http://dsn.tm.uni-karlsruhe.de/staff_hartenstein.php">TM Hartenstein</a></td> <td>Mein Fenster zur Welt &ndash; Visualisierung von Netzwerk-Traffic</td> <td>1</td> <td>#</td> </tr> <tr> <td>ITEC <a href="http://ces.itec.kit.edu/">Henkel</a></td> <td><a href="http://ces.itec.kit.edu/teaching/PSE_w1213/site_PSE.htm">Modulares Multimedia-Werkzeug zum Testen von Videoencodern</a></td> <td>2</td> <td>#</td> </tr> <tr> <td><a href="http://www.iks.kit.edu/index.php?id=iks-mueller-quade">IKS M&uuml;ller-Quade</a></td> <td><a href="https://www.iks.kit.edu/pse-ws12">Broadcast-Verschl&uuml;sselung &ndash; Pay-TV und andere Anwendungen</a></td> <td>1</td> <td>11</td> </tr> <tr> <td>IPD Reussner</td> <td><a href="https://sdqweb.ipd.kit.edu/wiki/Praxis_der_Software-Entwicklung_12_WS12/13">Bewertungssoftware f&uuml;r die Mensa</a></td> <td>4</td> <td>#</td> </tr> <tr> <td>IFA Schulz</td> <td>Tablet-basiertes Memory-Spiel f&uuml;r Menschen mit Demenz</td> <td>1</td> <td>#</td> </tr> <tr> <td rowspan="2">ITI Sanders</td> <td><a href="https://algo2.iti.kit.edu/2058.php">Entwicklung eines Routenplaners</a></td> <td>1</td> <td>#</td> </tr> <tr> <td>Flexibles Kartenrendering</td> <td>1</td> <td>#</td> </tr> <tr> <td><a href="http://www.ipd.kit.edu/Tichy/">IPD Tichy</a></td> <td>Der Microsoft Imagine Cup 2013 (<a href="http://en.wikipedia.org/wiki/Imagine_Cup">en-Wiki</a>)</td> <td>3</td> <td>#</td> </tr> </table> <p>30 Teams bei 5-7 Personen/Team <code>$\Rightarrow$</code> 150-210 Personen k&ouml;nnen dieses Semester PSE machen. Wir sind jedoch soweit ich wei&szlig; etwa 600...</p> Python Puzzle #3: Associativity http://martin-thoma.com/python-puzzle-3-associativity Tue, 02 Oct 2012 19:31:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-puzzle-3-associativity <p>What is the output of</p> <div class="highlight"><pre><code class="python"><span class="mi">1</span> <span class="ow">in</span> <span class="p">[]</span> <span class="ow">in</span> <span class="s">&#39;a&#39;</span> </code></pre></div> <p>and what is the output of</p> <div class="highlight"><pre><code class="python"><span class="p">(</span><span class="mi">1</span> <span class="ow">in</span> <span class="p">[])</span> <span class="ow">in</span> <span class="s">&#39;a&#39;</span> </code></pre></div> <p>or</p> <div class="highlight"><pre><code class="python"><span class="mi">1</span> <span class="ow">in</span> <span class="p">([]</span> <span class="ow">in</span> <span class="s">&#39;a&#39;</span><span class="p">)</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <p>The first expression evaluates to <code>False</code>, because it gets evaluated as <code>(1 in []) and ([] in &#39;a&#39;)</code> (<a href="http://docs.python.org/reference/expressions.html#not-in">Manual</a>, <a href="http://stackoverflow.com/a/12660938/562769">Source</a>).</p> <p>The second two expressions are invalid; they throw an error.</p> Sizes in LaTeX http://martin-thoma.com/sizes-in-latex Sat, 29 Sep 2012 16:23:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sizes-in-latex <p>Here is an overview of sizes in LaTeX:</p> <h2>TikZ</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/09/tikz-sizes.png"><img src="../images/2012/09/tikz-sizes.png" alt="" width="500" height="503" class="size-full"/></a><p class="wp-caption-text"></p></div> <p>Usage example: <code>\draw<a href="a%20-%7C%20current%20plot%20begin">ultra thick, blue,dashed</a> -- (a);</code> <ul> <li><code>ultra thin</code></li> <li><code>very thin</code></li> <li><code>thin</code></li> <li><code>semithick</code></li> <li><code>thick</code></li> <li><code>very thick</code></li> <li><code>ultra thick</code></li> </ul> <h2>Text</h2> <p style="text-align: center;"><a href="../images/2012/09/text-sizes-latex.png"><img class="size-full wp-image-45921 aligncenter" title="Text sizes in LaTeX" src="../images/2012/09/text-sizes-latex.png" alt="" width="512" height="110" /></a></p> Usage example: <code>\Huge <code>$\varepsilon$</code></code> <ul> <li><code>\tiny</code></li> <li><code>\scriptsize</code></li> <li><code>\footnotesize</code></li> <li><code>\small</code></li> <li><code>\normalsize</code></li> <li><code>\large</code></li> <li><code>\Large</code></li> <li><code>\LARGE</code></li> <li><code>\huge</code></li> <li><code>\Huge</code></li> </ul></p> <h2>Math</h2> <div style="width: 309px" class="wp-caption aligncenter"><a href="../images/2012/09/latex-math-sizes.png"><img src="../images/2012/09/latex-math-sizes.png" alt="" width="309" height="145" class="size-full wp-image-45931 "/></a><p class="wp-caption-text"></p></div> <p>Usage example: <code><code>$\scriptstyle \lim_{n \rightarrow \infty} (1 + \frac{1}{n})^n$</code></code> <ul> <li><code>\scriptscriptstyle</code></li> <li><code>\scriptstyle</code></li> <li><code>\textstyle</code></li> <li><code>\displaystyle</code></li> </ul></p> Code golf http://martin-thoma.com/code-golf Thu, 27 Sep 2012 06:47:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/code-golf <blockquote>Code golf is a type of recreational computer programming competition in which participants strive to achieve the shortest possible code that solves a certain problem.</blockquote> <p>Source: <a href="http://en.wikipedia.org/wiki/Code_golf">Wikipedia</a></p> <p>I&#39;ve recently found some very interesting code golf examples on <a href="http://codegolf.stackexchange.com">codegolf.stackexchange.com</a>:</p> <h2>Snake</h2> <p><a href="http://codegolf.stackexchange.com/q/7241/5240">Task</a>: Recreate the classic snake Game. </p> <p>The shortest answer is written in <a href="http://codegolf.stackexchange.com/a/7260/5240">Ruby in 316 characters</a>, the longest is written in <a href="http://codegolf.stackexchange.com/a/7255/5240">Java in 2239 characters</a>.</p> <p>Here is a Python answer with 818 characters:</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">pygame</span> <span class="kn">as</span> <span class="nn">p</span> <span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span> <span class="k">as</span> <span class="n">r</span> <span class="n">p</span><span class="o">.</span><span class="n">init</span><span class="p">();</span><span class="n">l</span><span class="o">=</span><span class="mi">20</span> <span class="n">c</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span> <span class="n">dp</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">display</span><span class="p">;</span><span class="n">w</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">500</span><span class="p">,</span><span class="mi">500</span><span class="p">))</span> <span class="n">C</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">Color</span><span class="p">;</span><span class="n">b</span><span class="o">=</span><span class="n">C</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span><span class="n">g</span><span class="o">=</span><span class="n">C</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="n">D</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span><span class="n">U</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="n">L</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span><span class="n">R</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="n">S</span><span class="o">=</span><span class="p">[</span><span class="n">R</span><span class="p">];</span><span class="n">d</span><span class="o">=</span><span class="n">R</span><span class="p">;</span><span class="n">n</span><span class="o">=</span><span class="p">[]</span> <span class="n">O</span><span class="o">=</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:{</span><span class="n">U</span><span class="p">:</span><span class="n">D</span><span class="p">,</span><span class="n">R</span><span class="p">:</span><span class="n">L</span><span class="p">,</span><span class="n">D</span><span class="p">:</span><span class="n">U</span><span class="p">,</span><span class="n">L</span><span class="p">:</span><span class="n">R</span><span class="p">}[</span><span class="n">t</span><span class="p">]</span> <span class="k">def</span> <span class="nf">Q</span><span class="p">(</span><span class="n">e</span><span class="p">):</span><span class="k">print</span> <span class="s">&quot;Score: </span><span class="si">%i</span><span class="s">&quot;</span><span class="o">%</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">S</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="n">p</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span> <span class="k">def</span> <span class="nf">K</span><span class="p">(</span><span class="n">e</span><span class="p">):</span><span class="k">global</span> <span class="n">d</span><span class="p">;</span><span class="n">_</span><span class="o">=</span><span class="p">{</span><span class="mi">276</span><span class="p">:</span><span class="n">L</span><span class="p">,</span><span class="mi">273</span><span class="p">:</span><span class="n">U</span><span class="p">,</span><span class="mi">274</span><span class="p">:</span><span class="n">D</span><span class="p">,</span><span class="mi">275</span><span class="p">:</span><span class="n">R</span><span class="p">}</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">key</span><span class="p">,(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">));</span><span class="n">d</span><span class="o">=</span><span class="ow">not</span> <span class="n">_</span><span class="o">==</span><span class="n">O</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="ow">and</span> <span class="n">_</span> <span class="ow">or</span> <span class="n">d</span> <span class="k">def</span> <span class="nf">N</span><span class="p">(</span><span class="n">S</span><span class="p">):[</span><span class="n">p</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">rect</span><span class="p">(</span><span class="n">w</span><span class="p">,</span><span class="n">g</span><span class="p">,[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">l</span><span class="p">,</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">l</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">l</span><span class="p">])</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">S</span><span class="o">+</span><span class="n">n</span><span class="p">]</span> <span class="k">def</span> <span class="nf">M</span><span class="p">():</span><span class="n">n</span><span class="o">=</span><span class="p">(</span><span class="n">r</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">24</span><span class="p">),</span><span class="n">r</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">24</span><span class="p">));</span><span class="k">return</span> <span class="n">n</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">S</span> <span class="ow">and</span> <span class="n">n</span> <span class="ow">or</span> <span class="n">M</span><span class="p">()</span> <span class="n">A</span><span class="o">=</span><span class="k">lambda</span> <span class="n">s</span><span class="p">,</span><span class="n">o</span><span class="p">:</span><span class="nb">tuple</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">y</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="n">o</span><span class="p">))</span> <span class="n">n</span><span class="o">=</span><span class="p">[</span><span class="n">M</span><span class="p">()]</span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="n">w</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">b</span><span class="p">);[{</span><span class="mi">12</span><span class="p">:</span><span class="n">Q</span><span class="p">,</span><span class="mi">2</span><span class="p">:</span><span class="n">K</span><span class="p">}</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">type</span><span class="p">,</span><span class="k">lambda</span> <span class="n">e</span><span class="p">:</span><span class="n">e</span><span class="p">)(</span><span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">p</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">()]</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span><span class="o">&lt;=</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">&lt;</span><span class="mi">25</span> <span class="ow">and</span> <span class="mi">0</span><span class="o">&lt;=</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">&lt;</span><span class="mi">25</span><span class="p">)</span> <span class="ow">or</span> <span class="n">A</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span><span class="n">d</span><span class="p">)</span> <span class="ow">in</span> <span class="n">S</span><span class="p">:</span> <span class="n">Q</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">if</span> <span class="n">A</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span><span class="n">d</span><span class="p">)</span> <span class="ow">in</span> <span class="n">n</span><span class="p">:</span> <span class="n">S</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">A</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span><span class="n">d</span><span class="p">));</span><span class="n">n</span><span class="o">=</span><span class="p">[</span><span class="n">M</span><span class="p">()]</span> <span class="k">else</span><span class="p">:</span> <span class="n">S</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">A</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span><span class="n">d</span><span class="p">));</span><span class="n">S</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="n">N</span><span class="p">(</span><span class="n">S</span><span class="p">);</span><span class="n">dp</span><span class="o">.</span><span class="n">update</span><span class="p">();</span><span class="n">c</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> </code></pre></div> <h2>Matrix determinant</h2> <p><a href="http://codegolf.stackexchange.com/q/8405/5240">Task</a>: Calculate the determinant of a <code>$n \times n$</code> matrix.</p> <p>Solution in <a href="http://en.wikipedia.org/wiki/J_(programming_language)">J</a> (61 characters):</p> <div class="highlight"><pre><code class="text">-/&gt;([:+/#(([{.&lt;:@[}.])[:*//._2,\2#])])&amp;amp;.&gt;(|.;])&quot;.];._2[1!:1[3 </code></pre></div> <p>Solution in Python (198 characters):</p> <div class="highlight"><pre><code class="python"><span class="n">t</span><span class="o">=</span><span class="nb">input</span><span class="p">()</span> <span class="n">e</span><span class="o">=</span><span class="nb">enumerate</span> <span class="n">p</span><span class="o">=</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:</span><span class="n">t</span> <span class="ow">and</span><span class="p">((</span><span class="n">b</span><span class="o">+</span><span class="p">[</span><span class="n">a</span><span class="p">],</span><span class="n">j</span><span class="o">+</span><span class="n">i</span><span class="p">)</span><span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">a</span> <span class="ow">in</span> <span class="n">e</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="k">for</span> <span class="n">b</span><span class="p">,</span><span class="n">j</span> <span class="ow">in</span> <span class="n">p</span><span class="p">(</span><span class="n">t</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]))</span><span class="ow">or</span><span class="p">[([],</span><span class="mi">0</span><span class="p">)]</span> <span class="k">print</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">t</span><span class="p">,(</span><span class="n">i</span><span class="p">,</span><span class="n">r</span><span class="p">):</span><span class="n">t</span><span class="o">*</span><span class="n">r</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">e</span><span class="p">(</span><span class="n">p</span><span class="p">),</span><span class="mi">1</span><span class="o">-</span><span class="n">i</span><span class="o">%</span><span class="mi">2</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="k">for</span> <span class="n">p</span><span class="p">,</span><span class="n">i</span> <span class="ow">in</span> <span class="n">p</span><span class="p">([</span><span class="n">t</span><span class="p">]</span><span class="o">+</span><span class="p">[</span><span class="nb">input</span><span class="p">()</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">:]]))</span> </code></pre></div> <h2>Factorial</h2> <p><a href="http://codegolf.stackexchange.com/q/607/5240">Task</a>: Find the factorial of a number.</p> <p>J (12 characters):</p> <div class="highlight"><pre><code class="text">f=:*/@:&gt;:@i. </code></pre></div> <p>Python (27 characters):</p> <div class="highlight"><pre><code class="python"><span class="n">f</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="o">**</span><span class="n">x</span> <span class="ow">or</span> <span class="n">x</span><span class="o">*</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> </code></pre></div> <p>By the way, the shortest Java solution is 85 characters long^^.</p> Crash Course: World History http://martin-thoma.com/crash-course-world-history Fri, 21 Sep 2012 17:19:52 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/crash-course-world-history <h2>#32: Coal, Steam, and The Industrial Revolution</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/zhL5DCizj5c" frameborder="0" allowfullscreen></iframe> <h2>A list</h2> <p>Here is the <a href="http://www.youtube.com/course?list=ECBDA2E52FB1EF80C9">YouTube Playlist</a>:</p> <ul> <li>#1: <a href="http://www.youtube.com/watch?v=Yocja_N5s1I">The Agricultural Revolution</a></li> <li>#2: <a href="http://www.youtube.com/watch?v=n7ndRwqJYDM">Indus Valley Civilization</a> - <a href="http://en.wikipedia.org/wiki/Indus_Valley_Civilization">Wikipedia</a></li> <li>#3: <a href="http://www.youtube.com/watch?v=sohXPx_XZ6Y">Mesopotamia</a></li> <li>#4: <a href="http://www.youtube.com/watch?v=Z3Wvw6BivVI">Ancient Egypt</a></li> <li>#5: <a href="http://www.youtube.com/watch?v=Q-mkVSasZIM">The Persians & Greeks</a></li> <li>#6: <a href="http://www.youtube.com/watch?v=8Nn5uqE3C9w">Buddha and Ashoka</a></li> <li>#7: <a href="http://www.youtube.com/watch?v=ylWORyToTo4">&lrm;2,000 Years of Chinese History! The Mandate of Heaven and Confucius</a></li> <li>#8: <a href="http://www.youtube.com/watch?v=0LsrkWDCvxg">Alexander the Great and the Situation ... the Great?</a></li> <li>#9: <a href="http://www.youtube.com/watch?v=vfe-eNq-Qyg">The Silk Road and Ancient Trade</a></li> <li>#10: <a href="http://www.youtube.com/watch?v=oPf27gAup9U">The Roman Empire. Or Republic. Or...Which Was It?</a></li> <li>#11: <a href="http://www.youtube.com/watch?v=TG55ErfdaeY">Christianity from Judaism to the Constantine</a></li> <li>#12: <a href="http://www.youtube.com/watch?v=3PszVWZNWVA">Fall of The Roman Empire...in the 15th Century</a></li> <li>#13: <a href="http://www.youtube.com/watch?v=TpcbfxtdoI8">Islam, the Quran, and the Five Pillars All Without a Flamewar</a></li> <li>#14: <a href="http://www.youtube.com/watch?v=QV7CanyzhZg">The Dark Ages...How Dark Were They, Really?</a></li> <li>#15: <a href="http://www.youtube.com/watch?v=X0zudTQelzI">The Crusades - Pilgrimage or Holy War?</a></li> <li>#16: <a href="http://www.youtube.com/watch?v=jvnU0v6hcUo">Mansa Musa and Islam in Africa</a></li> <li>#17: <a href="http://www.youtube.com/watch?v=szxPar0BcMo">Wait For It...The Mongols!</a></li> <li>#18: <a href="http://www.youtube.com/watch?v=a6XtBLDmPA0">International Commerce, Snorkeling Camels, and The Indian Ocean Trade</a></li> <li>#19: <a href="http://www.youtube.com/watch?v=UN-II_jBzzo">Venice and the Ottoman Empire</a></li> <li>#20: <a href="http://www.youtube.com/watch?v=etmRI2_9Q_A">Russia, the Kievan Rus, and the Mongols</a></li> <li>#21: <a href="http://www.youtube.com/watch?v=NjEGncridoQ">Columbus, de Gama, and Zheng He! 15th Century Mariners</a></li> <li>#22: <a href="http://www.youtube.com/watch?v=Vufba_ZcoR0">The Renaissance: Was it a Thing?</a></li> <li>#23: <a href="http://www.youtube.com/watch?v=HQPA5oNpfM4">The Columbian Exchange</a></li> <li>#24: <a href="http://www.youtube.com/watch?v=dnV_MTFEGIY">The Atlantic Slave Trade</a></li> <li>#25: <a href="http://www.youtube.com/watch?v=rjhIzemLdos">The Spanish Empire, Silver, & Runaway Inflation</a></li> <li>#26: <a href="http://www.youtube.com/watch?v=j0qbzNHmfW0">The Seven Years War</a></li> <li>#27: <a href="http://www.youtube.com/watch?v=2yXNrLTddME">The Amazing Life and Strange Death of Captain Cook</a></li> <li>#28: <a href="http://www.youtube.com/watch?v=HlUiSBXQHCw">Tea, Taxes, and The American Revolution</a></li> <li>#29: <a href="http://www.youtube.com/watch?v=lTTvKwCylFY">The French Revolution</a></li> <li>#30: <a href="http://www.youtube.com/watch?v=5A_o-nU5s2U">Haitian Revolutions</a></li> <li>#31: <a href="http://www.youtube.com/watch?v=ZBw35Ze3bg8">Latin American Revolutions</a></li> <li>#32: <a href="http://www.youtube.com/watch?v=zhL5DCizj5c">Coal, Steam, and The Industrial Revolution</a></li> <li>#33: <a href="http://www.youtube.com/watch?v=B3u4EFTwprM">Capitalism and Socialism</a></li> <li>#34: <a href="http://www.youtube.com/watch?v=Nosq94oCl_M">Samurai, Daimyo, Matthew Perry, and Nationalism</a></li> <li>#35: <a href="http://www.youtube.com/watch?v=alJaltUmrGo">Imperialism</a></li> <li>#36: <a href="http://www.youtube.com/watch?v=_XPZQ0LAlR4">Archdukes, Cynicism, and World War I</a></li> </ul> Aufgaben zur Integralrechnung http://martin-thoma.com/aufgaben-zur-integralrechnung Thu, 20 Sep 2012 06:56:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/aufgaben-zur-integralrechnung <p>Hier sind ein paar sch&ouml;ne Aufgaben und ausf&uuml;hrliche L&ouml;sungsfindungsbeschreibungen zur Integralrechnung.</p> <p>Diesen Artikel werde ich erg&auml;nzen, wenn ich weitere sch&ouml;ne Aufgaben finde.</p> <h2>Aufgabe 1</h2> <p><strong>Aufgabenstellung</strong>:</p> <p>Berechne das bestimmte Integral <code>$\int_1^2 \frac{\arctan(x)}{x^2} dx$</code>.</p> <p><strong>Wissen</strong>: <ul> <li>Partielle Integration</li> <li>Integration durch Substitution</li> <li>Partialbruchzerlegung</li> <li><code>$(\arctan(x))&#39; = \frac{1}{1+x^2}$</code></li> <li><code>$\arctan(1) = \frac{1}{4}$</code></li> </ul></p> <p><strong>Rechnung</strong>:</p> <p>Partielle Integration mit: <ul> <li><code>$f(x) = \arctan(x) \rightarrow f&#39;(x) = \frac{1}{1+x^2}$</code></li> <li><code>$g&#39;(x)= x^{-2} \rightarrow g(x) = -x^{-1}$</code></li> </ul></p> <p><code>$ \begin{align} \int_1^2 \frac{\arctan(x)}{x^2} dx &amp;= \left [ \arctan(x) \cdot (- \frac{1}{x}) \right ]_1^2 - \int_1^2 \frac{-1}{x \cdot (1+x^2)} dx\\ &amp;= - \frac{1}{2} \arctan(2) + \underbrace{\arctan(1)}_{\frac{1}{4}} + \int_1^2 \frac{1}{x \cdot (1+x^2)} dx \end{align}$</code></p> <p>Partialbruchzerlegung mit: <code>$\frac{A}{x} + \frac{B}{1+x^2} = \frac{1}{x \cdot (1+x^2)}\\ \Leftrightarrow A \cdot (1+x^2) + B \cdot x = 1\\ \Leftrightarrow A + Bx + Ax^2 = 1\\ \Rightarrow A= 1 \land B = -x:\\ \frac{1}{x} + \frac{-x}{1+x^2} = \frac{1}{x \cdot (1+x^2)}$</code></p> <p><code>$\begin{align} \int_1^2 \frac{\arctan(x)}{x^2} dx &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \int_1^2 \frac{1}{x} dx - \int_1^2 \frac{x}{1+x^2} dx\\ \end{align}$</code></p> <p>Substitution mit: <ul> <li><code>$u := 1+x^2$</code></li> <li><code>$\frac{du}{dx} = u&#39; = 2x \rightarrow dx = \frac{du}{2x}$</code></li> </ul></p> <p><code>$\begin{align} \int_1^2 \frac{\arctan(x)}{x^2} dx &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \left [ \log x \right ]_1^2 - \int_2^5 \frac{1}{2u} du\\ &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \log 2 - \frac{1}{2} \int_2^5 x dx\\ &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \log 2 - \frac{1}{2} \left [ \log(x) \right ]_2^5\\ &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \log 2 - \frac{1}{2} \log 5 + \frac{1}{2} \log 2\\ &amp;= \frac{1}{4} - \frac{1}{2} \arctan(2) + \frac{3}{2} \log 2 - \frac{1}{2} \log 5\\ &amp;= \frac{1}{2} \cdot \left (\frac{1}{2} - \arctan(2) + 3 \log 2 - \log 5 \right ) \end{align}$</code></p> <p><strong>Kontrolle</strong>: <a href="http://www.wolframalpha.com/input/?i=int+arctan%28x%29%2Fx%5E2+dx">Wolfram|Alpha</a></p> <h2>Aufgabe 2</h2> <p>Diese Aufgabe war in der Analysis I-Klausur vom Herbst 2006 am KIT. <strong>Aufgabenstellung</strong>:</p> <p>Berechne das bestimmte Integral <code>$\displaystyle \int_0^1 \frac{1}{(\sqrt[3]{x}+2) \cdot (\sqrt[3]{x}+1)} dx$</code>.</p> <p><strong>Wissen</strong>: <ul> <li>Integration durch Substitution</li> <li>Partialbruchzerlegung</li> <li>Logarithmusgesetze</li> </ul></p> <p><strong>Rechnung</strong>: Kommt vielleicht sp&auml;ter noch.</p> Integration durch Substitution http://martin-thoma.com/integration-durch-substitution Sun, 16 Sep 2012 09:32:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/integration-durch-substitution <p>Integration durch Substitution ist eine elementare Methode zum finden von Stammfunktionen von Integralen bzw. zum berechnen von Integralen.</p> <h2>Unbestimmte Integrale</h2> <h3>Beispiel 1</h3> <p><code>$\int e^{2x} dx = ?$</code></p> <p>Substituiere <code>$u = 2x$</code> und <code>$u&#39;(x) = \frac{du}{dx} = 2 \Rightarrow dx = \frac{du}{2}$</code> Also: <code>$\begin{align} \int e^{2x} dx &amp;\stackrel{sub}{=}\\ &amp;= \int e^u \frac{du}{2}\\ &amp;= \int \frac{1}{2} e^u du\\ &amp;= \frac{1}{2} \int e^u du\\ &amp;= \frac{1}{2} \int e^u du\\ &amp;= \frac{1}{2} e^u + C \\ &amp;\stackrel{resub}{=} \frac{1}{2} e^{2x} + C \end{align}$</code></p> <h3>Beispiel 2</h3> <p><code>$\int (x-1)^2 dx = ?$</code></p> <p>Substituiere <code>$u = x-1$</code> und <code>$u&#39;(x) = \frac{ \;\mathrm{d}u}{dx} 1 \Rightarrow dx = \;\mathrm{d}u$</code> Also: <code>$\begin{align} \int (x-1)^2 dx &amp;\stackrel{sub}{=}\\ &amp;= \int u^2 \;\mathrm{d}u\\ &amp;= \frac{1}{3} u^3 + C &amp;\stackrel{resub}{=} \frac{1}{3} (x-1)^3 + C \end{align}$</code></p> <h2>Bestimmte Integrale</h2> <p>Bei bestimmten Integralen muss man die Grenzen auch ersetzen.</p> <h3>Beispiel 1</h3> <p>Dieses Beispiel stammt aus der Klausur &bdquo;Analysis I&ldquo; vom Herbst 2010.</p> <p>Berechne <code>$\int_1^4 e^{\sqrt{x}} dx$</code>.</p> <p>Substituiere: <code>$\begin{align} u &amp;= \sqrt x\\ \frac{\;\mathrm{d}u}{dx} &amp;= u&#39; = \frac{1}{2\sqrt{x}}\\ \Leftrightarrow dx &amp;= 2 \sqrt{x} \;\mathrm{d}u = 2 u \;\mathrm{d}u \end{align}$</code>.</p> <p>Es gilt: <code>$\int_1^4 e^{\sqrt{x}} dx = \int_1^2 e^u 2 u \;\mathrm{d}u = 2 \int_1^2 u \cdot e^u \;\mathrm{d}u$</code>.</p> <p>Nun wird eine <a href="../partielle-integration/" title="Partielle Integration">partielle Integration</a> durchgef&uuml;hrt mit <code>$f&#39;(u)=e^u$</code> und <code>$g(u)=u$</code>:</p> <p><code>$\begin{align} 2 \int_1^2 u \cdot e^u \;\mathrm{d}u &amp;= 2 ([e^u \cdot u]_1^2 - \int_1^2 e^u du) \\ &amp;= 2((e^2 \cdot 2 - e) - [e^u]_1^2)\\ &amp;= 2 \cdot (2e^2 -e - (e^2 - e)) \\ &amp;= 2 \cdot e^2 \end{align}$</code></p> Partielle Integration http://martin-thoma.com/partielle-integration Sat, 15 Sep 2012 17:02:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/partielle-integration <p>Die partielle Integration bietet eine sch&ouml;ne M&ouml;glichkeit, Stammfunktionen von Integralen zu bestimmen. Dazu muss man folgende Regel k&ouml;nnen:</p> <p>Seien <code>$f, g$</code> stetig differenzierbare Funktionen.</p> <p><code>$\displaystyle \int_a^b f&#39;(x)\cdot g(x)\,\mathrm{d}x = \left [f(x)\cdot g(x) \right ]_{a}^{b} - \int_a^b f(x)\cdot g&#39;(x)\,\mathrm{d}x$</code>.</p> <h2>Beispiel</h2> <p>Folgendes <a href="http://de.wikipedia.org/wiki/Partielle_Integration#Beispiel_1">Beispiel aus Wikipedia</a> zeigt, wie man das geschickt nutzen kann:</p> <p><strong>Aufgabe</strong>: Berechne <code>$\int \sin(x) \cdot \cos(x) \,\mathrm{d}x$</code></p> <p><strong>L&ouml;sung</strong>: Es sei <code>$f(x) = \cos(x)$</code> und <code>$g&#39;(x)= \sin(x)$</code>. Es gilt: <code>$f&#39;(x) = - \sin(x)$</code> und <code>$g(x)= - \cos(x)$</code>.</p> <p>Durch partielle Integration erh&auml;lt man: <code>$\int \sin(x) \cdot \cos(x) \,\mathrm{d}x = -\cos^2(x) - \int \sin(x) \cdot \cos(x) \,\mathrm{d}x. $</code></p> <p>Addiert man auf beiden Seiten der Gleichung das Ausgangsintegral, ergibt sich: <code>$\begin{align} 2 \int \sin(x) \cdot \cos(x) \,\mathrm{d}x &amp;= - \cos^2(x)\\ \Leftrightarrow \int \sin(x) \cdot \cos(x) \,\mathrm{d}x &amp;= -\tfrac12\cos^2(x) \end{align}$</code></p> Konvergenz von Reihen http://martin-thoma.com/konvergenz-von-reihen Sat, 15 Sep 2012 07:02:02 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/konvergenz-von-reihen <p>Die folgenden Definitionen sind wortw&ouml;rtlich aus dem <a href="http://mitschriebwiki.nomeata.de/Ana1.pdf">inoffiziellem Skript f&uuml;r Analysis I</a> bei Herrn Dr. Schmoeger &uuml;bernommen worden.</p> <h2>Dreiecksungleichung</h2> <div class="definition">Ist `$\sum_{n=1}^{\infty}a_n$` absolut konvergent, so ist `$\sum_{n=1}^{\infty}a_n$` konvergent und es gilt: `$\left | \sum_{n=1}^{\infty}a_n \right | \leq \sum_{n=1}^{\infty} |a_n|$`</div> <h2>Leibniz-Kriterium</h2> <div class="definition">Sei `$(a_n)_{n \in \mathbb{N}}$` eine monoton fallende, reelle Nullfolge. Dann konvergiert die alternierende Reihe `$s = \sum_{n=0}^\infty (-1)^n a_n$`.</div> <h2>Wurzelkriterium</h2> <div class="definition">Sei `$(a_n)$` eine Folge und `$\alpha := \lim \sup \sqrt[n]{|a_n|}$`. <ol> <li>`$\alpha < 1 \Rightarrow \sum_{n=1}^{\infty} a_n$` konvergiert absolut</li> <li>`$\alpha > 1 \Rightarrow \sum_{n=1}^{\infty} a_n$` divergiert</li> <li>`$\alpha = 1 \Rightarrow$` keine Aussage &uuml;ber die Konvergenz von `$\sum_{n=1}^{\infty} a_n$` m&ouml;glich</li> </ol> </div> <h2>Majorantenkriterium</h2> <div class="definition">Gilt `$|a_n| \leq b_n ~\text{ffa } n \in \mathbb{N}$` und ist `$\sum_{n=1}^{\infty} b_n$` konvergent, so gilt: `$\sum_{n=1}^{\infty} a_n$` ist absolut konvergent.</div> <h2>Minorantenkriterium</h2> <div class="definition">Gilt `$a_n \geq b_n \geq 0 ~\text{ffa } n \in \mathbb{N}$` und ist `$\sum_{n=1}^{\infty} b_n$` divergent, so gilt: `$\sum_{n=1}^{\infty} a_n$` ist divergent.</div> <h2>Quotientenkriterium</h2> <div class="definition">Sei `$(a_n)$` eine Folge in `$\mathbb{R}$` und `$a_n \ne 0 \text{ ffa } \mathbb{N}$`. `$\alpha_n := \frac{a_{n+1}}{a_n}$` (ffa `$n \in \mathbb{N}$`). <ul> <li>Ist `$|\alpha_n| \ge 1 \text{ ffa } n \in \mathbb{N} \Rightarrow \sum a_n$` ist divergent.</li> <li>Es sei `$(\alpha_n)$` beschr&auml;nkt, `$\beta := \liminf |\alpha_n|$` und `$\alpha := \limsup |\alpha_n|$`.</li> <ul> <li>Ist `$\beta > 1 \Rightarrow \sum a_n$` ist divergent.</li> <li>Ist `$\alpha < 1 \Rightarrow \sum a_n$` ist absolut konvergent.</li> <li>Ist `$\alpha = \beta = 1$`, so ist keine allgemeine Aussage m&ouml;glich.</li> </ul> </li> </ul></div> Neil deGrasse Tyson http://martin-thoma.com/neil-degrasse-tyson Fri, 14 Sep 2012 16:26:00 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/neil-degrasse-tyson <div style="width: 128px" class="wp-caption alignright"><a href="../images/2012/09/Neil_deGrasse_Tyson.jpg"><img src="../images/2012/09/Neil_deGrasse_Tyson.jpg" alt="" width="128" height="128" class="size-full wp-image-44861"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Neil_degrasse">Neil deGrasse Tyson</a> is an American astrophysicist and science communicator. He is currently the Frederick P. Rose Director of the Hayden Planetarium at the Rose Center for Earth and Space and a research associate in the department of astrophysics at the American Museum of Natural History. And he gives hilarious talks and interviews.</p> <h2>Death By Black Hole</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/h1iJXOUMJpg" frameborder="0" allowfullscreen></iframe> <h2>Death By Giant Meteor</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/xaW4Ol3_M1o" frameborder="0" allowfullscreen></iframe> <p><a href="http://en.wikipedia.org/wiki/99942_Apophis">Apophis</a> is a near-Earth asteroid that caused a brief period of concern in December 2004 because initial observations indicated a small probability (up to 2.7%) that it would strike the Earth in 2029.</p> <h2>How to Deflect a Killer Asteroid</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/1-ReuLZ2quc" frameborder="0" allowfullscreen></iframe> <h2>Earth Is Bad for Life</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/GgGgkkGE7QU" frameborder="0" allowfullscreen></iframe> <h2>My Man, Sir Isaac Newton</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/danYFxGnFxQ" frameborder="0" allowfullscreen></iframe> Jordansche Normalform: 4x4 Matrizen http://martin-thoma.com/jordansche-normalform-4x4-matrizen Mon, 10 Sep 2012 09:28:08 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/jordansche-normalform-4x4-matrizen <div class="info">Hier sind `$4 \times 4$` Beispiele zum Hauptartikel <a href="../wie-berechnet-man-die-jordansche-normalform/" title="Wie berechnet man die Jordan&rsquo;sche Normalform?">Wie berechnet man die Jordan&rsquo;sche Normalform?</a>.</div> <h2>Beispiel 1</h2> <p>Gegeben sei die Matrix <code>$A \in \mathbb{R}^{4 \times 4}$</code>: <code>$A := \begin{pmatrix} 1 &amp; 2 &amp; 47 &amp; 11\\ 3 &amp; 2 &amp; 8 &amp; 15\\ 0 &amp; 0 &amp; 3 &amp; 1\\ 0 &amp; 0 &amp; 8 &amp; 1 \end{pmatrix}$</code>.</p> <h3>Jordannormalform bestimmen</h3> <p><strong>1. Charakteristisches Polynom berechnen:</strong> <code>$p_A(\lambda) = (\lambda - 5) \cdot (\lambda - 4) \cdot (\lambda + 1)^2$</code>.</p> <p>(&rarr; <a href="http://www.wolframalpha.com/input/?i=%7B%7B1%2C2%2C47%2C11%7D%2C%7B3%2C2%2C8%2C15%7D%2C%7B0%2C0%2C3%2C1%7D%2C%7B0%2C0%2C8%2C1%7D%7D">Wolfram|Alpha</a> und &bdquo;<a href="../wie-berechnet-man-das-charakteristische-polynom/">Wie berechnet man das charakteristische Polynom?</a>&ldquo;)</p> <p>Daraus folgt: <ul> <li><code>$\lambda = 5$</code> ist Eigenwert mit der algebraischen Vielfachheit 1.</li> <li><code>$\lambda = 4$</code> ist Eigenwert mit der algebraischen Vielfachheit 1.</li> <li><code>$\lambda = -1$</code> ist Eigenwert mit der algebraischen Vielfachheit 2.</li> </ul></p> <p>Es gibt also genau drei Jordan-Bl&ouml;cke in der Jordannormalform. Zwei davon haben die Kantenl&auml;nge 1 und deshalb nur ein Jordan-K&auml;stchen.</p> <p><strong>2. Anzahl der Jordank&auml;stchen bestimmen:</strong></p> <p><code>$ \begin{align} \dim \text{Eig}(-1) &amp;= \dim \text{Kern}(A +1 \cdot I) \\ &amp;= \dim \text{Kern} \begin{pmatrix} 2 &amp; 2 &amp; 47 &amp; 11\\ 3 &amp; 3 &amp; 8 &amp; 15\\ 0 &amp; 0 &amp; 4 &amp; 1\\ 0 &amp; 0 &amp; 8 &amp; 2 \end{pmatrix}\\ &amp;= \dim \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 1.5 &amp; 0\\ 1 &amp; 1 &amp; -3 &amp; 13\\ 0 &amp; 0 &amp; 1 &amp; \frac{1}{4}\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}\\ &amp;= \dim \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 1.5 &amp; 0\\ 0 &amp; 0 &amp; -4.5 &amp; 13\\ 0 &amp; 0 &amp; 1 &amp; \frac{1}{4}\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}\\ &amp;= \dim \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 1.5 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 14 \frac{1}{8}\\ 0 &amp; 0 &amp; 1 &amp; \frac{1}{4}\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}\\ &amp;= \dim \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 1 \end{pmatrix} = \dim \left [ \begin{pmatrix}1\\-1\\0\\0 \end{pmatrix}\right ]\\ &amp;= 1 \end{align} $</code></p> <p>Es gibt im Jordanblock zu <code>$\lambda = -1$</code> also genau ein Jordank&auml;stchen.</p> <p>Also ist die Jordansche Normalform festgelegt:</p> <p><code>$J_A = \begin{pmatrix} -1 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 4 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 5 \end{pmatrix}$</code></p> <p><a href="http://www.wolframalpha.com/input/?i=%7B%7B1%2C2%2C47%2C11%7D%2C%7B3%2C2%2C8%2C15%7D%2C%7B0%2C0%2C3%2C1%7D%2C%7B0%2C0%2C8%2C1%7D%7D">Kontrolle mit Wolfram|Alpha</a>. Scheint zu stimmen.</p> <h3>Basiswechselmatrix bestimmen</h3> <p>F&uuml;r jedes Jordank&auml;stchen der L&auml;nge <code>$i$</code> muss nun 1 Vektor gew&auml;hlt werden und <code>$i-1$</code> Vektoren m&uuml;ssen bestimmt werden. Daf&uuml;r muss <code>$\Omega(\lambda) := A - \lambda \cdot E$</code> bestimmt werden. </p> <p><strong>Eigenwert -1</strong>: <code>$\Omega(-1) = \begin{pmatrix} 2 &amp; 2 &amp; 47 &amp; 11\\ 3 &amp; 3 &amp; 8 &amp; 15\\ 0 &amp; 0 &amp; 4 &amp; 1\\ 0 &amp; 0 &amp; 8 &amp; 2 \end{pmatrix}$</code></p> <p><code>$\begin{aligned} K_1(-1) &amp;= \text{Kern } \Omega(-1) \\ &amp;= \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 23.5 &amp; 5.5\\ 0 &amp; 0 &amp; -62.5 &amp; -5.5\\ 0 &amp; 0 &amp; 4 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 0\end{pmatrix} \\ &amp;= \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 1\end{pmatrix} \\ &amp;= \left [ \begin{pmatrix}1 \\ -1 \\ 0 \\ 0 \end{pmatrix} \right ] \end{aligned}$</code>.</p> <p><code>$\Omega(-1)^2 = \begin{pmatrix} 10 &amp; 10 &amp; 386 &amp; 121\\ 15 &amp; 15 &amp; 317 &amp; 116\\ 0 &amp; 0 &amp; 24 &amp; 6\\ 0 &amp; 0 &amp; 48 &amp; 12 \end{pmatrix}$</code>.</p> <p>Da das K&auml;stchen die Gr&ouml;&szlig;e 2 hat, ben&ouml;tigen wir noch <code>$K_2$</code>:</p> <p><code>$K_2(-1) = \left [ \begin{pmatrix} 1 \\ -1 \\ 0 \\ 0 \end{pmatrix}, \begin{pmatrix} \frac{49}{20} \\ 0 \\ \frac{1}{4} \\ -1 \end{pmatrix} \right ] = \left [ \begin{pmatrix} 1 \\ -1 \\ 0 \\ 0 \end{pmatrix}, \begin{pmatrix} 49 \\ 0 \\ 5 \\ -20 \end{pmatrix} \right ] $</code>.</p> <p>(Check mit <a href="http://www.wolframalpha.com/input/?i=NullSpace+%7B%7B2%2C2%2C47%2C11%7D%2C%7B3%2C3%2C8%2C15%7D%2C%7B0%2C0%2C4%2C1%7D%2C%7B0%2C0%2C8%2C2%7D%7D%5E2">Wolfram|Alpha</a>. Scheint zu stimmen.)</p> <p>Nun muss ein Vektor aus <code>$K_2(-1)$</code> gew&auml;hlt werden, der nicht in <code>$K_1(-1)$</code> ist. Das ist dann der erste Basisvektor f&uuml;r unsere Basiswechselmatrix. Die Wahl ist hier eindeutig:</p> <p><code>$b_1 := \begin{pmatrix}49\\0\\5\\-20\end{pmatrix}$</code> <code>$b_2 := \Omega(-1) \cdot b_1 = \begin{pmatrix}113\\-113\\0\\0\end{pmatrix}$</code></p> <p><strong>Eigenwert 4</strong>: <code>$\Omega(4) = \begin{pmatrix} -3 &amp; 2 &amp; 47 &amp; 11\\ 3 &amp; -2 &amp; 8 &amp; 15\\ 0 &amp; 0 &amp; -1 &amp; 1\\ 0 &amp; 0 &amp; 8 &amp; -3 \end{pmatrix}$</code></p> <p><code>$K_1(4) = \left [ \begin{pmatrix} -\frac{2}{3} \\ - 1 \\ 0 \\ 0\end{pmatrix} \right ] = \left [ \begin{pmatrix} 2 \\ 3 \\ 0 \\ 0\end{pmatrix} \right ] \Rightarrow b_3 := \begin{pmatrix} 2 \\ 3 \\ 0 \\ 0\end{pmatrix}$</code></p> <p><strong>Eigenwert 5</strong>: <code>$\Omega(5) = \begin{pmatrix} -4 &amp; 2 &amp; 47 &amp; 11\\ 3 &amp; -3 &amp; 8 &amp; 15\\ 0 &amp; 0 &amp; -2 &amp; 1\\ 0 &amp; 0 &amp; 8 &amp; -4 \end{pmatrix}$</code></p> <p><code>$K_1(5) = \left [ \begin{pmatrix} -\frac{283}{12} \\ - \frac{359}{12} \\ -\frac{1}{2} \\ -1\end{pmatrix} \right ] = \left [ \begin{pmatrix} 283 \\ 359 \\ 6 \\ 12\end{pmatrix} \right ] \Rightarrow b_4 := \begin{pmatrix} 283 \\ 359 \\ 6 \\ 12\end{pmatrix}$</code></p> <p>Nun muss man die Vektoren noch in der richtigen Reihenfolge zusammensetzen. Da wir zuerst das -1 Jordank&auml;stchen, dann das 4er Jordank&auml;stchen und dann das 5er-K&auml;stchen wollen, schreiben wir sie in dieser Reihenfolge auf: <code>$S = \begin{pmatrix}b_2 &amp; b_1 &amp; b_3 &amp; b_4\end{pmatrix} = \begin{pmatrix} 113 &amp; 49 &amp; 2 &amp; 283\\ -113 &amp; 0 &amp; 3 &amp; 359\\ 0 &amp; 5 &amp; 0 &amp; 6\\ 0 &amp; -20&amp; 0 &amp; 12\end{pmatrix}$</code></p> <p>Dann gilt:</p> <p><code>$S^{-1} = \frac{1}{101700} \cdot \begin{pmatrix} 540 &amp; -360 &amp; -4384 &amp; 227\\ 0 &amp; 0 &amp; 6780 &amp; -3390\\ 20340 &amp; 20340 &amp; -1517364 &amp; -329508\\ 0 &amp; 0 &amp; 1130 &amp; 2825\end{pmatrix}$</code> (<a href="http://www.wolframalpha.com/input/?i=inverse+%7B%7B113%2C49%2C2%2C283%7D%2C%7B-113%2C0%2C3%2C359%7D%2C%7B0%2C5%2C0%2C6%7D%2C%7B0%2C-20%2C0%2C12%7D%7D">Wolfram|Alpha</a>)</p> <p>Nun sollte <code>$J = S^{-1} \cdot A \cdot S$</code> gelten. Also, Schritt f&uuml;r Schritt:</p> <p><code>$S^{-1} \cdot A \cdot S = \frac{1}{101700} \cdot \begin{pmatrix} -540 &amp; 360 &amp; 1164 &amp; -3617\\ 0 &amp; 0 &amp; -6780 &amp; 3390\\ 81360 &amp; 81360 &amp; -6069456 &amp; -1318032\\ 0 &amp; 0 &amp; 56500 &amp; 14125 \end{pmatrix} \cdot S = \begin{pmatrix} -1 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 4 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 5 \end{pmatrix}$</code> (<a href="http://www.wolframalpha.com/input/?i=%7B%7B3%2F565%2C+-2%2F565%2C+-1096%2F25425%2C+227%2F101700%7D%2C+%7B0%2C+0%2C+1%2F15%2C+-1%2F30%7D%2C+%7B1%2F5%2C+1%2F5%2C+-373%2F25%2C+-81%2F25%7D%2C+%7B0%2C+0%2C+1%2F9%2C+1%2F36%7D%7D*%7B%7B1%2C2%2C47%2C11%7D%2C%7B3%2C2%2C8%2C15%7D%2C%7B0%2C0%2C3%2C1%7D%2C%7B0%2C0%2C8%2C1%7D%7D">Wolfram|Alpha</a> und <a href="http://www.wolframalpha.com/input/?i=%7B%7B-3%2F565%2C+2%2F565%2C+2791%2F25425%2C+-3617%2F101700%7D%2C+%7B0%2C+0%2C+-1%2F15%2C+1%2F30%7D%2C+%7B4%2F5%2C+4%2F5%2C+-1492%2F25%2C+-324%2F25%7D%2C+%7B0%2C+0%2C+5%2F9%2C+5%2F36%7D%7D*%7B%7B113%2C49%2C2%2C283%7D%2C%7B-113%2C0%2C3%2C359%7D%2C%7B0%2C5%2C0%2C6%7D%2C%7B0%2C-20%2C0%2C12%7D%7D">Schritt 2</a>)</p> <h3>Programmierung</h3> <p>Bei diesem Beispiel haben sowohl Python (numpy) als auch Wolfram|Alpha und Mathematica versagt:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">linalg</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">47</span><span class="p">,</span><span class="mi">11</span><span class="p">],[</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">15</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">113</span><span class="p">,</span><span class="mi">49</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">283</span><span class="p">],[</span><span class="o">-</span><span class="mi">113</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">359</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">6</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">12</span><span class="p">]]</span> <span class="n">A</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="n">numpy</span><span class="o">.</span><span class="n">set_printoptions</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">suppress</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;S^{-1} * A * S&quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">A</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> </code></pre></div> <p>Wolfram|Alpha hatte eine zu kleine Eingabegr&ouml;&szlig;e, Mathematica hat einfach gar nicht mehr reagiert und Python hat ein falsches Ergebnis ausgespuckt.</p> <h2>Beispiel 2</h2> <p>Gegeben sei die Matrix <code>$B \in \mathbb{C}^{4 \times 4}$</code>: <code>$B := \begin{pmatrix} -1 &amp; -2 &amp; 2 &amp; 2\\ 2 &amp; 0 &amp; 1 &amp; -1\\ 2 &amp; 1 &amp; 0 &amp; -1\\ 0 &amp; -2 &amp; 2 &amp; 1 \end{pmatrix}$</code></p> <h3>Jordannormalform bestimmen</h3> <p><strong>1. Charakteristisches Polynom berechnen:</strong> <code>$p_B(\lambda) = (1-\lambda)^2 \cdot (1+\lambda)^2$</code>.</p> <p>Daraus folgt: <ul> <li><code>$\lambda = 1$</code> ist Eigenwert mit der algebraischen Vielfachheit 2.</li> <li><code>$\lambda = -1$</code> ist Eigenwert mit der algebraischen Vielfachheit 2.</li> </ul></p> <p>Es gibt also genau zwei Jordan-Bl&ouml;cke in der Jordannormalform. Beide haben die Kantenl&auml;nge 2.</p> <p><strong>2. Anzahl der Jordank&auml;stchen bestimmen:</strong> <code>$\begin{align} \dim \text{Eig}(1) &amp;= \dim \text{Kern}(A-E)\\ &amp;= \dim \text{Kern }\begin{pmatrix} -2 &amp; -2 &amp; 2 &amp; 2\\ 2 &amp; -1 &amp; 1 &amp; 1\\ 2 &amp; 1 &amp; -1 &amp; -1\\ 0 &amp; -2 &amp; 2 &amp; 0 \end{pmatrix}\\ &amp;= \dim \text{Kern }\begin{pmatrix} 1 &amp; 1 &amp; -1 &amp; -1\\ 0 &amp; -3 &amp; 3 &amp; 3\\ 0 &amp; -1 &amp; 1 &amp; 1\\ 0 &amp; 1 &amp; -1 &amp; 0 \end{pmatrix}\\ &amp;= \dim \text{Kern }\begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; -1\\ 0 &amp; 1 &amp; -1 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 1 \end{pmatrix} \\ &amp;= \dim \left [\begin{pmatrix}0\\1\\1\\0\end{pmatrix} \right ] = 1 \end{align}$</code></p> <p>Analog: <code>$\begin{align} \dim \text{Eig}(-1) &amp;= \dim \text{Kern}(A-E)\\ &amp;= \dim \text{Kern }\begin{pmatrix} 0 &amp; -2 &amp; 2 &amp; 2\\ 2 &amp; 1 &amp; 1 &amp; 1\\ 2 &amp; 1 &amp; 1 &amp; -1\\ 0 &amp; -2 &amp; 2 &amp; 2 \end{pmatrix}\\ &amp;= \dim \text{Kern }\begin{pmatrix} 1 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 1 &amp; -1 &amp; -1\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix} \\ &amp;= \dim \left [\begin{pmatrix}1\\-1\\-1\\0\end{pmatrix}, \begin{pmatrix}0\\1\\0\\1\end{pmatrix} \right ] = 2 \end{align}$</code></p> <p>Also ist die Jordansche Normalform festgelegt:</p> <p><code>$J_B = \begin{pmatrix} -1 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 1 \end{pmatrix}$</code> &rarr; <a href="http://www.wolframalpha.com/input/?i=%7B%7B-1%2C-2%2C2%2C2%7D%2C%7B2%2C0%2C1%2C-1%7D%2C%7B2%2C1%2C0%2C-1%7D%2C%7B0%2C-2%2C2%2C1%7D%7D">Kontrolle mit Wolfram|Alpha</a></p> <h3>Basiswechselmatrix bestimmen</h3> <p>F&uuml;r jedes Jordank&auml;stchen der L&auml;nge <code>$i$</code> muss nun 1 Vektor gew&auml;hlt werden und <code>$i-1$</code> Vektoren m&uuml;ssen bestimmt werden. Daf&uuml;r muss <code>$\Omega(\lambda) := A - \lambda \cdot E$</code> bestimmt werden. </p> <p><strong>Eigenwert 1:</strong> <code>$K_1(1) = \left [\begin{pmatrix}0\\1\\1\\0\end{pmatrix} \right ]$</code>. <code>$\begin{align} K_2(1) &amp;= \text{Kern}(\Omega(1)^2) \\ &amp;= \text{Kern }\begin{pmatrix} -2 &amp; -2 &amp; 2 &amp; 2\\ 2 &amp; -1 &amp; 1 &amp; 1\\ 2 &amp; 1 &amp; -1 &amp; -1\\ 0 &amp; -2 &amp; 2 &amp; 0 \end{pmatrix}^2 \\ &amp;= \text{Kern }\begin{pmatrix} 4 &amp; 4 &amp; -4 &amp; -4\\ -4 &amp; 0 &amp; 0 &amp; 4\\ -4 &amp; -4 &amp; 4 &amp; 4\\ 0 &amp; 4 &amp; -4 &amp; 0 \end{pmatrix}\\ &amp;= \text{Kern }\begin{pmatrix}\\ 1 &amp; 0 &amp; 0 &amp; -1\\ 0 &amp; 1 &amp; -1 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix} \\ &amp;= \left [ \begin{pmatrix}0\\1\\1\\0\end{pmatrix}, \begin{pmatrix}1\\0\\0\\1\end{pmatrix} \right ] \end{align}$</code></p> <p>Nun muss ein Vektor aus <code>$K_2(1)$</code> gew&auml;hlt werden, der nicht in <code>$K_1(1)$</code> ist. Das ist dann der erste Basisvektor f&uuml;r unsere Basiswechselmatrix. Die Wahl ist hier eindeutig:</p> <p><code>$b_1 = \begin{pmatrix}1\\0\\0\\1\end{pmatrix}$</code>. <code>$b_2 = \Omega(1) \cdot b_1 = \begin{pmatrix}0\\1\\1\\0\end{pmatrix}$</code>. <code>$b_3 = \begin{pmatrix}1\\-1\\-1\\0\end{pmatrix}, ~~~ b_4 = \begin{pmatrix}0\\1\\0\\1\end{pmatrix}$</code>.</p> <p>Nun muss man die Vektoren noch in der richtigen Reihenfolge zusammensetzen. Da wir zuerst den -1 Jordanblock und dann den 1er-Jordanblock wollen, schreiben wir sie in dieser Reihenfolge auf: <code>$S = \begin{pmatrix}b_3 &amp; b_4 &amp; b_2 &amp; b_1\end{pmatrix} = \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 1\\ -1 &amp; 1 &amp; 1 &amp; 0\\ -1 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 1\end{pmatrix}$</code></p> <h3>Programmierung</h3> <p>Hier kann man mal sch&ouml;n ein paar Variationen ausprobieren:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">linalg</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">],[</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">],[</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="c"># b3, b4, b2, b1</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="c"># b2, b1, b3, b4 - zuerst 1er Block</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="c"># Die Reihenfolge der Vektoren f&amp;uuml;r die Jordank&amp;auml;stchen innerhalb</span> <span class="c"># eines Jordanblocks ist egal</span> <span class="c"># b2, b1, b4, b3 = b2, b1, b3, b4 != alle anderen Reihenfolgen</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">]]</span> <span class="c"># Mit (b1, b2, b3, b4) ist die 1 auf der Nebendiagonale unten</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="n">B</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="n">numpy</span><span class="o">.</span><span class="n">set_printoptions</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">suppress</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;S^{-1} * B * S&quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">B</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> </code></pre></div> <h2>Beispiel 3</h2> <p>Die Matrix aus diesem Beispiel ist aus der Klausur vom Fr&uuml;hjahr 2012 bei Prof. Dr. Wildericht Tuschmann.</p> <p>Gegeben sei die Matrix <code>$C \in \mathbb{R}^{4 \times 4}$</code>: <code>$C := \begin{pmatrix} 1 &amp; 0 &amp; -1 &amp; -1\\ -1 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 2 &amp; 1\\ 1 &amp; 1 &amp; 0 &amp; 1 \end{pmatrix}$</code>.</p> <h3>Jordannormalform bestimmen</h3> <p><strong>1. Charakteristisches Polynom berechnen:</strong> <code>$p_C(\lambda) = (\lambda - 1)^4$</code>.</p> <p>Es gibt also genau einen Jordan-Block in der Jordannormalform.</p> <p><strong>2. Anzahl der Jordank&auml;stchen bestimmen:</strong></p> <p><code>$ \begin{align} \Omega &amp;= \begin{pmatrix} 0 &amp; 0 &amp; -1 &amp; -1\\ -1 &amp; -1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 1 &amp; 1 &amp; 0 &amp; 0 \end{pmatrix}\\ \Omega^2 &amp;= \begin{pmatrix} -1 &amp; -1 &amp; -1 &amp; -1\\ 1 &amp; 1 &amp; 1 &amp; 1\\ 1 &amp; 1 &amp; 1 &amp; 1\\ -1 &amp; -1 &amp; -1 &amp; -1 \end{pmatrix}\\ \Omega^3 &amp;= \begin{pmatrix} 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix} \end{align} $</code>.</p> <p><code>$\begin{align} \text{Eig}(1) &amp;= K_1(1) = \text{Kern}(\Omega) \\ &amp;= \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}\\ &amp;= \left [ \begin{pmatrix}1\\-1\\0\\0\end{pmatrix}, \begin{pmatrix}0\\0\\1\\-1\end{pmatrix} \right ] \end{align} $</code></p> <p>Jetzt wissen wir, dass es zwei Jordank&auml;stchen gibt. Es gibt also zwei M&ouml;glichkeiten: <ul> <li>Ein Jordank&auml;stchen hat die Gr&ouml;&szlig;e 1, dann muss das Andere die Gr&ouml;&szlig;e 3 haben.</li> <li>Ein Jordank&auml;stchen hat die Gr&ouml;&szlig;e 2, dann muss das Andere die Gr&ouml;&szlig;e 2 haben.</li> </ul></p> <p><code>$\begin{align} K_2(1) &amp;= \text{Kern}(\Omega^2) \\ &amp;= \text{Kern} \begin{pmatrix} 1 &amp; 1 &amp; 1 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}\\ &amp;= \left [ \begin{pmatrix}1\\-1\\0\\0\end{pmatrix}, \begin{pmatrix}1\\0\\-1\\0\end{pmatrix}, \begin{pmatrix}1\\0\\0\\-1\end{pmatrix} \right ]\\ K_3(1) &amp;= \text{Kern}(\Omega^3) = \mathbb{R}^4\\ \end{align} $</code></p> <p>Da erst <code>$K_3(1) = \mathbb{R}^4$</code> ist das gr&ouml;&szlig;te Jordank&auml;stchen von der Gr&ouml;&szlig;e 3. Damit ergibt sich folgende Jordannormalform:</p> <p><code>$J = \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 1 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 1 \end{pmatrix}$</code></p> <h3>Basiswechselmatrix bestimmen</h3> <p>F&uuml;r jedes Jordank&auml;stchen der L&auml;nge <code>$i$</code> muss nun 1 Vektor gew&auml;hlt werden und <code>$i-1$</code> Vektoren m&uuml;ssen bestimmt werden. Daf&uuml;r muss <code>$\Omega(\lambda) := C - \lambda \cdot E$</code> bestimmt werden. </p> <p><strong>Eigenwert 1:</strong> <strong>K&auml;stchengr&ouml;&szlig;e 3</strong> <code>$b_1 \in K_3(1) \land b_1 \notin K_2(1) \Rightarrow b_1 \in \left [ \begin{pmatrix}1\\0\\0\\0\end{pmatrix} \right ]$</code>. W&auml;hle <code>$b_1 = \begin{pmatrix}1\\0\\0\\0\end{pmatrix}$</code>.</p> <p><code>$b_2 = \Omega(b_1) = \begin{pmatrix}0\\-1\\0\\1\end{pmatrix}$</code>.</p> <p><code>$b_3 = \Omega^2(b_1) = \Omega(b_2)= \begin{pmatrix}-1\\1\\1\\-1\end{pmatrix}$</code></p> <p><strong>K&auml;stchengr&ouml;&szlig;e 1</strong> <code>$b_4 = \begin{pmatrix}1\\-1\\0\\0\end{pmatrix}$</code></p> <p>Das 1-er K&auml;stchen soll zuerst kommen, also muss <code>$b_4$</code> zuerst in die Basiswechselmatrix. Unsere gesuchte Matrix <code>$S$</code> f&uuml;r die oben angegebene JNF ist also: <code>$S = \begin{pmatrix} b_4 &amp; b_3 &amp; b_2 &amp; b_1 \end{pmatrix} = \begin{pmatrix} 1 &amp; -1 &amp; 0 &amp; 1\\ -1 &amp; 1 &amp; -1 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 1 &amp; 0 \end{pmatrix} $</code></p> <p>Nun sollte <code>$J = S^{-1} \cdot C \cdot S$</code> gelten. Also, Schritt f&uuml;r Schritt:</p> <p><code>$\begin{align} S^{-1} \cdot C \cdot S &amp;= \begin{pmatrix} 0 &amp; -1 &amp; 0 &amp; -1\\ 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 1 &amp; 1 &amp; 1 &amp; 1 \end{pmatrix} \cdot \begin{pmatrix} 1 &amp; 0 &amp; -1 &amp; -1\\ -1 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 2 &amp; 1\\ 1 &amp; 1 &amp; 0 &amp; 1 \end{pmatrix} \cdot \begin{pmatrix} 1 &amp; -1 &amp; 0 &amp; 1\\ -1 &amp; 1 &amp; -1 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 1 &amp; 0 \end{pmatrix}\\ &amp;= \begin{pmatrix} 0 &amp; -1 &amp; 0 &amp; -1\\ 0 &amp; 0 &amp; 2 &amp; 1\\ 1 &amp; 1 &amp; 2 &amp; 2\\ 1 &amp; 1 &amp; 1 &amp; 1 \end{pmatrix} \cdot \begin{pmatrix} 1 &amp; -1 &amp; 0 &amp; 1\\ -1 &amp; 1 &amp; -1 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; 1 &amp; 0 \end{pmatrix} \\ &amp;= \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 1 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 1 \end{pmatrix} \end{align}$</code></p> <h3>Programmierung</h3> <p>Hier habe ich mal f&uuml;r Leute, die kein Python haben, als Kommentar das Ergebnis pr&auml;sentiert. Ich denke damit ist klar, welchen Einfluss die Reihenfolge der Basisvektoren hat.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">linalg</span> <span class="n">numpy</span><span class="o">.</span><span class="n">set_printoptions</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">suppress</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span> <span class="n">C</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">b1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span> <span class="n">b2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span> <span class="n">b3</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">b4</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b1</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">b3</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4123&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 1 1 0]</span> <span class="c"># [ 0 0 1 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b1</span><span class="p">,</span><span class="n">b3</span><span class="p">,</span><span class="n">b2</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c">#[[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4132&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 0 1 1]</span> <span class="c"># [ 0 1 0 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">b1</span><span class="p">,</span><span class="n">b3</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4213&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 1 0]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 0 1 0]</span> <span class="c"># [ 0 1 0 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">b3</span><span class="p">,</span><span class="n">b1</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4231&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 0 1]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 1 1 0]</span> <span class="c"># [ 0 0 0 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b3</span><span class="p">,</span><span class="n">b1</span><span class="p">,</span><span class="n">b2</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4312&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 0 1]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 0 1 0]</span> <span class="c"># [ 0 0 1 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b4</span><span class="p">,</span><span class="n">b3</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">b1</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 0 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;4321&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 1 0]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 0 1 1]</span> <span class="c"># [ 0 0 0 1]]</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">([</span><span class="n">b3</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">b1</span><span class="p">,</span><span class="n">b4</span><span class="p">])</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span> <span class="c"># [[ 1 1 0 0]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;3214&quot;</span><span class="p">)</span> <span class="c"># [ 0 1 1 0]</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="o">*</span> <span class="n">C</span> <span class="o">*</span> <span class="n">S</span><span class="p">)</span> <span class="c"># [ 0 0 1 0]</span> <span class="c"># [ 0 0 0 1]]</span> </code></pre></div> Berechnung der euklidischen Normalform http://martin-thoma.com/berechnung-der-euklidischen-normalform Mon, 10 Sep 2012 05:57:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/berechnung-der-euklidischen-normalform <p>Die euklidische Normalform einer linearen Isometrie, manchmal auch lineare Normalform gennant, hat folgende Gestalt:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/09/math-euklidische-normalform.png"><img src="../images/2012/09/math-euklidische-normalform.png" alt="" width="512" height="291" class="size-full wp-image-43911 "/></a><p class="wp-caption-text"></p></div> <p>Bei einer <code>$n \times n$</code>-Matrix gilt also folgende Gleichung: <code>$n = p + q + 2r$</code></p> <h2>Bestimmung der Normalform</h2> <p>Sei <code>$\Phi$</code> eine lineare Isometrie eines euklidischen Vektorraumes. Dann habe <code>$\Phi$</code> die Abbildungsmatrix <code>$A$</code>. Sei <code>$B := A + A^T$</code>. Wenn man die euklidische Normalform bilden will, bestimmt man zuerst das charakteristische Polynom von <code>$B$</code>. Die Nullstellen davon sind die Eigenwerte. Die algebraische Vielfachheit des Eigenwertes 2 von <code>$B$</code> (die Potenz im charakteristischen Polynom) gibt die Anzahl der 1er an, genauso gibt die Vielfachheit des Eigenwertes -2 die Anzahl der -1er an.</p> <p>Die restlichen Eigenwerte <code>$\lambda_1, \dots, \lambda_r$</code> geben die Drehk&auml;stchen an.</p> <p>Es gilt: <code>$\cos \omega = \frac{\lambda}{2}$</code> <code>$\sin \omega = \sqrt{1 - \frac{\lambda^2}{4}}$</code></p> <p>Mit diesen Angaben kann man direkt die euklidische Normalform angeben.</p> <h2>Bestimmung der Transformationsmatrix</h2> <h3>Eigenr&auml;ume bestimmen</h3> <p>Die Eigenr&auml;ume berechnet man wie gewohnt:</p> <p><code>$\text{Eig}(\lambda_i) = \text{Kern}(B- \lambda_i \cdot E)$</code></p> <h3>ONB bestimmen</h3> <p>Nun w&auml;hlt man f&uuml;r jeden Eigenraum eine Basis Orthonormalbasis aus Eigenvektoren. Das kann man mit dem Gram-Schmidtsches Orthogonalisierungsverfahren machen, also: W&auml;hle ein beliebiges <code>$w_1 \in \text{Eig}(\lambda_i)$</code>. <code>$w_j = v_j &amp;ndash; \sum_{i=1}^{j-1} \frac{\langle v_j, w_i \rangle}{\langle w_i, w_i \rangle} \cdot w_i$</code></p> <h2>Quellen</h2> <ul> <li>Skript von Prof. Dr. Leuzinger, S. 228 ff.</li> <li>Klausur &bdquo;Lineare Algebra und analytische Geometrie&ldquo; vom Fr&uuml;hjahr 2007, Aufgabe II.4</li> </ul> How to check if a point is inside a rectangle http://martin-thoma.com/how-to-check-if-a-point-is-inside-a-rectangle Fri, 07 Sep 2012 19:28:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-check-if-a-point-is-inside-a-rectangle <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/09/rectangle.png"><img src="../images/2012/09/rectangle.png" alt="" width="512" height="409" class="size-full wp-image-43611 "/></a><p class="wp-caption-text"></p></div> <p>I&#39;ve just found this interesting question on <a href="http://math.stackexchange.com/q/190111/6876">StackExchange</a>:</p> <p>If you have a rectangle ABCD and point P. Is P inside ABCD?</p> <h2>The idea</h2> <p>The idea how to solve this problem is simply beautiful. </p> <p>If the point is in the rectangle, it divides it into four rectangles:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/09/rectangle-2.png"><img src="../images/2012/09/rectangle-2.png" alt="" width="512" height="409" class="size-full wp-image-43651 "/></a><p class="wp-caption-text"></p></div> <p>If P is not inside of ABCD, you end up with somethink like this:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/09/rectangle-3.png"><img src="../images/2012/09/rectangle-3.png" alt="" width="512" height="409" class="size-full wp-image-43661 "/></a><p class="wp-caption-text"></p></div> <p>You might note that the area of the four triangles in is bigger than the area of the rectangle. So if the area is bigger, you know that the point is outside of the rectangle.</p> <h2>Formulae</h2> <p>If you know the coordinates of the points, you can calculate the area of the rectangle like this:</p> <p><code>$A_\text{rectangle} = \frac{1}{2} \left| (y_{A}-y_{C})\cdot(x_{D}-x_{B}) + (y_{B}-y_{D})\cdot(x_{A}-x_{C})\right|$</code></p> <p>The area of a triangle is: <code>$A_\text{triangle} = \frac{1}{2} (x_1(y_2-y_3) + x_2(y_3-y_1) + x_3(y_1-y_2))$</code></p> <h2>Python</h2> <div class="important">Please look at Jans comment. There is an error in my Python code, but I don't have the time to correct it.</div> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">isPinRectangle</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">P</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; </span> <span class="sd"> r: A list of four points, each has a x- and a y- coordinate</span> <span class="sd"> P: A point</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">areaRectangle</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="nb">abs</span><span class="p">(</span> <span class="c"># y_A y_C x_D x_B </span> <span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="c"># y_B y_D x_A x_C</span> <span class="o">+</span> <span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="p">)</span> <span class="n">ABP</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="p">(</span> <span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="p">)</span> <span class="n">BCP</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="p">(</span> <span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="p">)</span> <span class="n">CDP</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="p">(</span> <span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="p">)</span> <span class="n">DAP</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">*</span><span class="p">(</span> <span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="p">)</span> <span class="k">return</span> <span class="n">areaRectangle</span> <span class="o">==</span> <span class="p">(</span><span class="n">ABP</span><span class="o">+</span><span class="n">BCP</span><span class="o">+</span><span class="n">CDP</span><span class="o">+</span><span class="n">DAP</span><span class="p">)</span> </code></pre></div> <h2>Triangle</h2> <p>The same idea can easily be adopted to triangles:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">class</span> <span class="nc">Point</span><span class="p">:</span> <span class="sd">&quot;&quot;&quot;Represents a two dimensional point.&quot;&quot;&quot;</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="k">def</span> <span class="nf">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="k">return</span> <span class="n">obj</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">&quot;P(</span><span class="si">%.2lf</span><span class="s">|</span><span class="si">%.2lf</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Triangle</span><span class="p">:</span> <span class="sd">&quot;&quot;&quot;Represents a triangle in R^2.&quot;&quot;&quot;</span> <span class="n">epsilon</span> <span class="o">=</span> <span class="mf">0.001</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">Point</span><span class="p">)</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Point</span><span class="p">)</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">Point</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">a</span> <span class="o">=</span> <span class="n">a</span> <span class="bp">self</span><span class="o">.</span><span class="n">b</span> <span class="o">=</span> <span class="n">b</span> <span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="k">def</span> <span class="nf">getArea</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Get area of this triangle.</span> <span class="sd"> &gt;&gt;&gt; Triangle(Point(0.,0.), Point(10.,0.), Point(10.,10.)).getArea()</span> <span class="sd"> 50.0</span> <span class="sd"> &gt;&gt;&gt; Triangle(Point(-10.,0.), Point(10.,0.), Point(10.,10.)).getArea()</span> <span class="sd"> 100.0</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">x</span><span class="o">*</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="n">c</span><span class="o">.</span><span class="n">y</span><span class="p">)</span><span class="o">+</span><span class="n">b</span><span class="o">.</span><span class="n">x</span><span class="o">*</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="n">a</span><span class="o">.</span><span class="n">y</span><span class="p">)</span><span class="o">+</span><span class="n">c</span><span class="o">.</span><span class="n">x</span><span class="o">*</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="n">b</span><span class="o">.</span><span class="n">y</span><span class="p">))</span><span class="o">/</span><span class="mi">2</span> <span class="k">def</span> <span class="nf">isInside</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">p</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Check if p is inside this triangle.&quot;&quot;&quot;</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">Point</span><span class="p">)</span> <span class="n">currentArea</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getArea</span><span class="p">()</span> <span class="n">pab</span> <span class="o">=</span> <span class="n">Triangle</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">b</span><span class="p">)</span> <span class="n">pac</span> <span class="o">=</span> <span class="n">Triangle</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="p">)</span> <span class="n">pbc</span> <span class="o">=</span> <span class="n">Triangle</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="p">)</span> <span class="n">newArea</span> <span class="o">=</span> <span class="n">pab</span><span class="o">.</span><span class="n">getArea</span><span class="p">()</span><span class="o">+</span><span class="n">pac</span><span class="o">.</span><span class="n">getArea</span><span class="p">()</span><span class="o">+</span><span class="n">pbc</span><span class="o">.</span><span class="n">getArea</span><span class="p">()</span> <span class="k">return</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">currentArea</span> <span class="o">-</span> <span class="n">newArea</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">Triangle</span><span class="o">.</span><span class="n">epsilon</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">doctest</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span> </code></pre></div> Bundeswettbewerb Informatik http://martin-thoma.com/bundeswettbewerb-informatik Tue, 04 Sep 2012 09:42:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/bundeswettbewerb-informatik <p><div style="width: 128px" class="wp-caption alignright"><a href="../images/2012/09/bwinf-thumb.png"><img src="../images/2012/09/bwinf-thumb.png" alt="" width="128" height="128" class="size-full wp-image-43131"/></a><p class="wp-caption-text"></p></div>Die erste Runde des 31. Bundeswettbewerb Informatik (kurz: BwInf) begann heute. Das bedeutet, bis zum 03.12.2012 haben Sch&uuml;ler mal wieder die Chance zu zeigen, was sie in der Informatik drauf haben. Es gibt keine verpflichtende Anmeldung, nur die Einsendung. Wenn ihr diesen Beitrag also vor dem 03.12.2012 lest, k&ouml;nnt ihr noch teilnehmen.</p> <p>Die offiziellen Informationen zum Wettbewerb, dessen <a href="http://www.bundeswettbewerb-informatik.de/index.php?id=629">Ablauf</a>, die <a href="http://www.bundeswettbewerb-informatik.de/index.php?id=628">Teilnahmebedingungen</a> und die <a href="http://www.bundeswettbewerb-informatik.de/index.php?id=1161">Aufgaben</a> gibt es auf <a href="http://www.bundeswettbewerb-informatik.de/">bundeswettbewerb-informatik.de</a>. Das Folgende ist inoffiziell; es sind meine pers&ouml;nlichen Erfahrungen.</p> <p>Ich habe selbst ein paar mal am Bundeswettbewerb teilgenommen und bin bei meiner letzten Teilnahme Bundessieger geworden. Sp&auml;ter habe ich Musterl&ouml;sungen erstellt und an der Korrektur der Erstrunden- und Zweitrundenaufgaben teilgenommen. Ich wei&szlig; also wovon ich rede.</p> <h2>Aufbau des Wettbewerbs</h2> <p>Der BwInf besteht aus drei Runden, in denen algorithmische Probleme gel&ouml;st werden m&uuml;ssen. Die ersten beiden Runden werden von zu Hause erledigt. Daf&uuml;r habt ihr mehr als genug Zeit - jeweils &uuml;ber einen Monat. Die dritte Runde m&uuml;sst ihr vor Ort bestehen. Diese l&auml;uft vollkommen anders ab, aber dar&uuml;ber will ich mal noch nichts berichten. (Falls ihr unbedingt einen Bericht wollt, hier ist der von <a href="http://www.tobias-thierer.de/endrunde.html">Tobias</a>).</p> <p>Nur wer in der ersten Runde mindestens drei von f&uuml;nf (+ 3 Junioraufgaben) Aufgaben weitgehend richtig gel&ouml;st hat, wird zur Zweiten zugelassen. Die Aufgaben der zweiten Runde sind prinzipiell &auml;hnlich aufgebaut, jedoch deutlich schwerer zu l&ouml;sen. Immer wieder sind <code>$\mathcal{NP}$</code>-vollst&auml;ndige Probleme dabei.</p> <h2>Warum sollte man teilnehmen?</h2> <p>Programmiert ihr gerne? Habt ihr Spa&szlig; daran, an Aufgaben zu knobeln? Denkt ihr dar&uuml;ber nach, wie man bereits gel&ouml;ste Probleme noch effizienter l&ouml;sen kann?</p> <p>Dann ist der Bundeswettbewerb auf jeden Fall etwas f&uuml;r euch!</p> <p>Selbst wenn ihr nicht alle Fragen &uuml;berzeugt mit einem &bdquo;Ja&ldquo; beantworten k&ouml;nnt, k&ouml;nnte der Bundeswettbewerb euch gefallen. Probier es einfach mal aus.</p> <p>Einen weiteren Anreitz bieten Preise: Die Bundessieger werden soweit ich wei&szlig; immer in die Studienstiftung aufgenommen und es gibt Geldpreise.</p> <p>Und noch ein Schlusswort zur Motivation: Eine gute Dokumentation zu schreiben ist anstrengend. Ich hatte h&auml;ufig bei der Dokumentation keine Lust mehr, sie noch ein weiteres mal anzusehen. Sie nochmals zu verbessern. Aber die Arbeit lohnt sich. Wenn ihr sie fertig geschrieben habt, k&ouml;nnt ihr stolz darauf sein. Wie ein Sprichwort so sch&ouml;n sagt: &bdquo;Ohne Flei&szlig; kein Preis.&ldquo;</p> <h2>Tipps zur Aufgabenbearbeitung</h2> <h3>Zur L&ouml;sungsfindung</h3> <p>Wenn ihr ein Skript habt, dass eventuell nicht sofort, aber nach ein paar Stunden die L&ouml;sung ausgeben sollte, dann vergesst nicht, auch eine Ausgabe mit Zwischenergebnissen daf&uuml;r einzubauen! Kaum etwas ist &auml;rgerlicher, als ein Programm, das lange l&auml;uft und am Ende keine Ausgabe macht oder sich aufh&auml;ngt.</p> <h3>Doku ist wichtig</h3> <p>Bei der Korrektur wird zuerst die Dokumentation angesehen. Nat&uuml;rlich ist die L&ouml;sungsidee wichtig, aber eine negativ bewertete Dokumentation ist &auml;rgerlich. Also lest euch bitte die Dokumentation nochmals durch und &uuml;berpr&uuml;ft, ob die wichtigen L&ouml;sungsideen verst&auml;ndlich erkl&auml;rt wurden. </p> <p>Ich denke das ist wohl der einzige Aspekt, wo euch andere helfen k&ouml;nnen. Gerade Leute ohne Programmierkenntnis sollten eure L&ouml;sungsidee verstehen k&ouml;nnen. Mein Vater (der nicht programmieren kann) hat h&auml;ufig meine Einseundungen nochmals auf Rechtschreib- und Grammatikfehler sowie auf fehlende Zusammenh&auml;nge &uuml;berpr&uuml;ft. Er konnte zwar nicht sagen, was dort nicht stimmt, hat aber h&auml;ufig ... naja, sagen wir mal Stellen gefunden, bei denen meine Deutschlehrer wohl Zahnschmerzen h&auml;tten (trifft wohl auch auf diesen Blog zu ;-) )</p> <p>Also: Schreibt die Doku fr&uuml;h. Ich habe sie geschrieben, w&auml;hrend ich programmiert habe. Dann setzt irgendwann eine Version auf, von der ihr denkt, dass sie fertig ist. Wartet so ein, zwei Tage und lest sie euch nochmals durch (es ist wirklich erstaunlich, was man dann sieht). Dann sucht euch jemanden, der die Aufgabenstellung nicht kennt und nicht programmieren kann. Der Korrekturleser sollte das Deutsche nat&uuml;rlich gut beherrschen. So ein Korrekturleser streicht nur mangelhafte Stellen in eurer endg&uuml;ltigen Version an, macht aber keine Verbesserungsvorschl&auml;ge. Die m&uuml;sst ihr euch selbst &uuml;berlegen. Und dann ist man wirklich froh, wenn man das bl&ouml;de Ding los ist.</p> <p>Eine Randbemerkung dazu noch: Ich habe mal einen kurzen Job als Programmierer f&uuml;r ein gr&ouml;&szlig;eres Projekt &uuml;bernommen. Dabei gab es &uuml;ber 2GB, die gr&ouml;&szlig;tenteils C++-Code und ein paar Testdaten waren (rechnet es aus, das ist VERDAMMT viel Code!). Die hatten keine Dokumentation! Ich habe bestimmt eine Woche nur damit verbracht, mich mehr oder weniger wahllos durch wirre Quelltexte zu klicken, weil ich noch nicht einmal wusse, wo ich genau anfangen soll. Ich glaube den Zweck einer Dokumentation versteht man erst nach einem solchem Erlebnis.</p> <h3>Beispiele</h3> <p>Die Beispiele werden leider hin und wieder vergessen und sind oft aussagekr&auml;ftig. &Uuml;berlegt euch: Welche Eingaben sind Standard-F&auml;lle? Welche Eingaben sind Sonderf&auml;lle?</p> <p>Die Beispiele sollen euch helfen, Probleme zu entdecken. Eventuell funktioniert eure Implementierung nicht so, wie ihr es euch vorstellt. Das k&ouml;nnt ihr damit feststellen. In diesem Zusammenhang solltet ihr euch das Konzept der <a href="http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung">testgetriebenen Entwicklung</a> ansehen. Dabei schreibt man zuerst alle wichtigen Testf&auml;lle, bevor man &uuml;berhaupt eine Zeile produktiven Codes schreibt. Beispielsweise f&uuml;r die Aufgabe &bdquo;Verben&ldquo; w&uuml;rde ich heute so eine Herangehensweise w&auml;hlen.</p> <p>Ach ja: Es kann sein, dass ihr ein Problem feststellt, dieses aber nicht beheben k&ouml;nnt. Dann solltet ihr es beschreiben. Es wird sowieso entdeckt. Man kann eurer L&ouml;sungsidee erkennen, welche schw&auml;chen die Implementierung hat.</p> <h3>Versionskontrolle</h3> <p>Ich habe leider erst nach dem Bundeswettbewerb meine ersten Erfahrungen mit Versionskontrollsystemen gesammelt. Immer wenn ich eine Idee hatte, wie man das Problem anders angehen k&ouml;nnte, habe ich eine Kopie der aktuellen Version erstellt und auf der Kopie weiter gearbeitet. Diese L&ouml;sung ist jedoch in vielerlei Hinsicht einem Versionskontrollsystem - <a href="http://wiki.ubuntuusers.de/Subversion">SVN</a> und <a href="http://wiki.ubuntuusers.de/Git">Git</a> sind die bekanntesten - unterlegen. Man kann nicht so leicht eine Sicherung durchf&uuml;hren. Es ist un&uuml;bersichtlich, die wiederherstellung bei vielen Dateien ist schwer und man kann sich nicht so leicht die Unterschiede von verschiedenen Versionen anzeigen lassen. Zum vergleich: <a href="http://code.google.com/p/pychess/source/diff?spec=svn05804049a2723955ec26cdbaea3b40811273f37f&r=05804049a2723955ec26cdbaea3b40811273f37f&format=side&path=/create_theme_preview.py">Hier</a> kann man sich den Unterschied zweier Versionen auf code.google.com ansehen. Mit <a href="http://wiki.ubuntuusers.de/Meld">meld</a> bekommt man &auml;hnlich gute Ergebnisse auch auf dem eigenem Rechner.</p> <h3>LaTeX</h3> <p>LaTeX ist toll - aber keine Pflicht. Es werden leider relativ wenige Dokumentationen mit LaTeX erstellt. Dabei bietet LaTeX f&uuml;r den BwInf ein paar Vorteile: <ul> <li>Das Ergebnis kann sich sehen lassen, LaTeX sieht einfach sch&ouml;n aus.</li> <li>Man kann die Doku in die Versionskontrolle stecken.</li> <li>Man kann Quelltext automatisch einbinden lassen (siehe dazu ein <a href="../how-to-print-source-code-with-latex/">Blogpost</a> von mir).</li> <li>Und so bekommt man LaTeX: <a href="../how-to-install-the-latest-latex-version/">How to install the latest LaTeX Version</a>.</li> </ul></p> <p>Au&szlig;erdem ist die Kombination <a href="../latex-versioning-a-great-experience/">LaTeX+Versionskontrolle</a> toll :-)</p> <h3>Die CD</h3> <p>Ich wei&szlig; leider nicht, warum keine Online-Abgabe m&ouml;glich ist. Vielleicht, weil es einfacher ist. Eventuell aus Sicherheitsgr&uuml;nden. Wenn man Papier und eine CD in der Hand hat, kann es nicht passieren, dass eine Runde im schlimmsten Szenario komplett ausfallen muss, weil der Server abgeraucht ist. Egal wie, ihr m&uuml;sst die CD erstellen. Dazu h&auml;tte ich - aus Sicht eines Korrektors - ein paar Bitten:</p> <p>Die CD hat &uuml;ber 600 MB. Das ist deutlich mehr, als ihr braucht. Also schreibt doch bitte auch die Beispiele des BwInf darauf, sowie eine PDF-Datei eurer Doku. Das erleichtert die Korrektur ungemein, da man so die Doku durchsuchen kann. &Uuml;berpr&uuml;ft, ob die CD auch wirklich gebrannt wurde, abgeschlossen wurde und sie lesbar ist. Wenn eure Dokumentation schlecht ist und die CD nicht lesbar ist, kann eventuell eine gute L&ouml;sungsidee schlecht bewertet werden.</p> <p>edit: Hier habe ich eine R&uuml;ckmeldung von Herrn Dr. Pohl erhalten. Es geht nicht um CD vs. Online-Abgabe sondern um CD und &bdquo;gedruckte Dokumentation und CD&ldquo; vs. &bdquo;Online-Abgabe&ldquo;. Die Korrektur von L&ouml;sungsideen auf einem Blatt Papier ist immer noch die einfachste und f&uuml;r den Leser die angenehmste. Ich schreibe als Korrektor h&auml;ufig Anmerkungen in eure Dokumentation, damit der Zweitkorrektor leichter nachvollziehen kann, was ich mangelhaft oder auch sehr gut gefunden habe. Au&szlig;erdem schreibe ich manchmal rein, was der Einsender gemeint hat (falls die Doku nicht so toll war und es nicht direkt ersichtlich ist). Au&szlig;erdem ist es mit CDs einfacher, die Infrastruktur f&uuml;r die Korrektur aufzubauen. An den Bewertungswochenenden werden so ca. 30 frisch aufgesetzte, unvernetzte PCs benutzt (es lohnt sich also nicht, Viren zu schreiben). Bei einer Online-Abgabe m&uuml;ssten diese PCs Internet haben, was leider nicht immer zur Verf&uuml;gung steht. Oder sie m&uuml;ssten lokal, z.B. auf einem NAS, sein. Das ist alles etwas umst&auml;ndlicher als einfach eine CD zu brennen. Ihr d&uuml;rft &uuml;brigens auch SD-Karten einschicken :-)</p> <p>Vielen Dank an Herrn Dr. Pohl f&uuml;r die Hinweise!</p> <h2>Die Programmiersprache</h2> <p>Also eine <a href="http://de.wikipedia.org/wiki/Brainfuck">Brainfuck</a>-Einsendung muss jetzt nicht gerade sein (obwohl ich wirklich beeindruckt w&auml;re). Aber eine <a href="http://de.wikipedia.org/wiki/Shakespeare_Programming_Language">Shakespeare</a>-Einsendung w&uuml;rde ich mal toll finden :-) Nein, im ernst: Ihr d&uuml;rft fast alles benutzen. Ich selbst kann Python, PHP, Java, C++ und C gut genug um jede Einsendung verstehen zu k&ouml;nnen. Ich wei&szlig;, dass wir immer Leute haben die Haskel/Objective CAML und vielleicht noch ein paar weitere funktionale Sprachen k&ouml;nnen. Auch Pascal, Delphi (Object Pascal), BASIC stellen kein Problem dar. Das ist jetzt keine vollst&auml;ndige Liste; unter den Korrektoren gibt es einige, die auch exotische Sprachen k&ouml;nnen. Aber wenn euch klar ist, dass eure Sprache exotisch ist, dann solltet ihr besondere Sprachfeatures kommentieren.</p> <p>Ich habe damals meine Einsendung in PHP geschrieben, sp&auml;ter in Python. Warum PHP? Naja, es gibt ein super <a href="http://tut.php-quake.net/de/">Tutorial f&uuml;r PHP</a>.</p> <p>Welche Programmiersprache w&uuml;rde ich heute nehmen? Nun, es gibt keine Programmiersprache die f&uuml;r jeden Zweck gut ist. F&uuml;r kleine Probleme - und Bundeswettbewerbsaufgaben sind zwar schwer, aber doch recht &uuml;bersichtlich - eignet sich h&auml;ufig Python gut. Falls es in der zweiten Runde auf Geschwindigkeit ankommt, ist wohl C++ eine Sprache der Wahl. F&uuml;r sp&auml;ter empfiehlt es sich, Java zu lernen. Aber ihr m&uuml;sst keine dieser Sprachen nehmen. Das ist ja das tolle am BwInf. Es steht euch frei, das zu w&auml;hlen, was f&uuml;r euch das beste ist.</p> <h2>Quelltext-Kommentare</h2> <p>Trotz Doku sind Quelltextkommentare erw&uuml;nscht. Allerdings m&uuml;ssen Standard-Strukturen (if/else,for,while, Variablendeklarationen) nicht kommentiert werden! &Uuml;bertreibt es nicht, aber verwendet Kommentare, wenn einem Au&szlig;enstehendem nicht direkt klar sein kann, was ihr macht. Java-Programmierer sollten definitiv die standard Sun <a href="http://de.wikipedia.org/wiki/Checkstyle">Checkstyle</a> und <a href="http://de.wikipedia.org/wiki/Javadoc">JavaDoc</a> verwenden, Python-Programmierer sollten <a href="http://www.python.org/dev/peps/pep-0257/#one-line-docstrings">DocStrings</a> kennen und verwenden. F&uuml;r alle anderen Sprachen muss man halt ein Gef&uuml;hl entwickeln. Wer in C wild mit Pointern um sich wirft sollte tendenziell wohl mehr Kommentare machen als jemand, der Pythons Standardbefehle nutzt.</p> <h2>Was sollte man lernen?</h2> <p>Falls ihr Informatik studieren wollt oder sp&auml;ter programmieren wollt, sind SVN und GIT unverzichtbar. Au&szlig;erdem werdet ihr wohl mit Java und C++ in Kontakt kommen. Am <a href="http://de.wikipedia.org/wiki/Karlsruher_Institut_f%C3%BCr_Technologie">KIT</a> wird euch beigebracht, wie ihr mit Eclipse und checkstyle umgeht. Aber es wird auch erwartet, dass ihr es nutzt. Ich vermute, dass f&uuml;r viele wissenschaftliche Ver&ouml;ffentlichungen im Natur- und Ingenieurswissenschaftlichen Bereich LaTeX kaum wegzudenken ist. (Ach ja: Ihr k&ouml;nnt auch <a href="../briefe-mit-latex-schreiben/" title="Briefe mit LaTeX schreiben">Briefe mit LaTeX schreiben</a> und <a href="../complex-latex-visualizations-tikz/" title="Complex LaTeX visualizations (Tikz)">komplexe Grafiken mit LaTeX erstellen</a>!)</p> <h3>Website-Empfehlungen</h3> <p>Das meiste, was ihr wissen m&uuml;sst, k&ouml;nnt ihr &uuml;ber Wikipedia lernen. Ich habe mich z.B. mal durch die <a href="http://de.wikipedia.org/wiki/Kategorie:Algorithmus">Kategorie:Algorithmus</a> geklickt. Das ist nicht sonderlich zielf&uuml;hrend und sicher nicht jedermanns Sache, aber so habe ich mir einiges beigebracht. Ob es mir viel genutzt hat, kann ich nur schwer beurteilen.</p> <p>Wenn ihr Interessantes rund um die praktische Informatik in kleinen Portionen lernen wollt, ist der Newsletter von <a href="http://stackoverflow.com/">StackOverflow.com</a> empfehlenswert. Der ist zwar auf englisch, aber ich glaube das Englisch ist einfach genug. Au&szlig;erdem werdet ihr im Informatik-Bereich h&auml;ufig auf englische Literatur, Websites, Manuals oder Spezifikationen treffen. Man muss sich vielleicht mal daran gew&ouml;hnen, mit <a href="http://dict.leo.org">leo</a> einiges &Uuml;bersetzen, aber das gibt sich schnell.</p> <p>Es gibt &uuml;brigens von einigen Universit&auml;ten Online-Vorlesungen. Ich habe mir damals eine <a href="http://ocw.mit.edu/courses/#electrical-engineering-and-computer-science">Vorlesung vom MIT</a> komplett angesehen (das waren damals zwei Dozenten, von denen einer Prof. John Guttag war). Dieses Semester habe ich vom Stanford <a href="https://class.coursera.org/algo-2012-002/class/index">Algorithms: Design and Analysis</a> durchgearbeitet. Die stellen sogar eine PDF-Urkunde mit deinen Ergebnissen aus. <a href="http://www.udacity.com/">Udacity</a> bietet in der Hinsicht auch interessante Kurse.</p> <p>Wenn ihr generell am Knobeln Spa&szlig; habt, kann ich sogenannte &bdquo;<a href="../challenge-websites/">Challenge Websites</a>&ldquo; empfehlen. Die Probleme sind (gr&ouml;&szlig;tenteils) schneller zu l&ouml;sen als beim Bundeswettbewerb und man muss keine Doku schreiben.</p> <h3>Buchempfehlungen</h3> <p>F&uuml;r die zweite Runde kann ich &bdquo;Computers and Intractability: A Guide to the Theory of NP-Completeness&ldquo; (<a href="http://de.wikipedia.org/wiki/Vorlage:BibISBN/0716710455">Link</a>) empfehlen. Es wird in der zweiten Runde h&auml;ufig (immer?) erwartet, dass man auf die Komplexit&auml;t des Problems bzw. das Laufzeitverhalten der eigenen L&ouml;sung eingeht. Wenn man das besonders gut macht, gibt es hin und wieder Bonuspunkte. Wenn ihr dieses Buch - das ganz eindeutig dem Bereich der Theoretischen Informatik zuzuordnen ist und f&uuml;r einen Sch&uuml;ler bestimmt keine leichte Lekt&uuml;re ist - versteht und das Wissen &uuml;bertragen k&ouml;nnt, dann k&ouml;nntet ihr hier Boni erhalten. Aber wie gesagt, das zu verstehen und auf ein konkretes Problem zu &uuml;bertragen ist nicht leicht.</p> <p>Deutlich einfacher ist &bdquo;Theoretische Informatik - kurz gefasst&ldquo;. Das Buch gibt eine grundlegende Einleitung und ist auf deutsch.</p> <p>Und, nur um es nochmals zu betonen: Das sind pers&ouml;nliche Erfahrungen und teilweise Bitten von jemanden, der es korrigiert. Wenn Teilnehmer meine Tipps nicht beachten, gibt es keinen Punktabzug und es gibt auch keine Bonuspunkte, wenn ihr sie beachtet. Aber ihr erleichtert ein paar Leuten die Korrektur, ihr lernt dabei eventuell was neues (LaTeX und GIT/SVN werdet ihr im Informatik-Studium noch ben&ouml;tigen) und vielleicht fallen euch Fehler oder M&auml;ngel in eurer L&ouml;sung auf.</p> <p>Falls ihr Fragen habt kann ich die auch gerne beantworten. Auf <a href="http://ikhaya.ubuntuusers.de/2012/09/01/der-31-bundeswettbewerb-informatik-startet/">Ikhaya</a> habe ich bereits ein paar beantwortet.</p> Nobel Prize in Physics 2009 http://martin-thoma.com/nobel-prize-in-physics-2009 Sat, 01 Sep 2012 09:09:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/nobel-prize-in-physics-2009 <p>Did you know how the election for a <a href="http://en.wikipedia.org/wiki/Nobel_Prize">Nobel Prize</a> works? Have you ever heard of a <a href="http://en.wikipedia.org/wiki/Charge-coupled_device">CCD</a>? I guess you know <a href="http://en.wikipedia.org/wiki/Optical_fiber">fiberoptics</a>?</p> <iframe width="512" height="288" src="http://www.youtube.com/embed/8Nt1or4tHD4" frameborder="0" allowfullscreen></iframe> <p>I&#39;ve found this clip via <a href="http://forschungspreisen.de/post/30594203694/nobelpreis-2009-ccd-und-glasfaseroptik-wie">forschungspreisen.de</a>, a german blog about science.</p> <h2>See also</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/List_of_Nobel_laureates">List of Nobel laureates</a></li> <li><a href="http://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country">List of Nobel laureates by country</a></li> <li><a href="http://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_university_affiliation">List of Nobel laureates by university affiliation</a></li> </ul> How to reverse engineer a function http://martin-thoma.com/how-to-reverse-engineer-a-function Mon, 27 Aug 2012 07:49:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-reverse-engineer-a-function <p>I am currently improving many articles on Wikipedia as a preparation for some math exams. And I recently started to create images with LaTeX / TikZ. </p> <p>Today, I&#39;ve found <a href="http://commons.wikimedia.org/wiki/File:Intermediatevaluetheorem.png">this image</a> in the article about the Intermediate value theorem: <div style="width: 327px" class="wp-caption aligncenter"><a href="../images/2012/08/Intermediatevaluetheorem.png"><img src="../images/2012/08/Intermediatevaluetheorem.png" alt="" width="327" height="266" class="size-full wp-image-42411"/></a><p class="wp-caption-text"></p></div></p> <h2>Get special points</h2> <p>As a first step, you should open the image with <a href="http://en.wikipedia.org/wiki/GIMP">GIMP</a> (or any other editor of your choice) and find the pixel-coordinates of special points: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/function-in-gimp.png"><img src="../images/2012/08/function-in-gimp.png" alt="" width="512" height="391" class="size-full wp-image-42441"/></a><p class="wp-caption-text"></p></div></p> <p><del datetime="2012-08-30T08:36:40+00:00">This function has a maximum at (123 | 105) and a minimum at (172 | 218)</del> ... well, thats not correct. Note that the axis of GIMP starts at the upper left. So the y-axis is wrong.</p> <p>I have cropped and flipped the image vertically. Now you can read the minimum / maximum coordinates with GIMP:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/gimp-function-cropped-flipped.png"><img src="../images/2012/08/gimp-function-cropped-flipped.png" alt="" width="512" height="507" class="size-full wp-image-42631"/></a><p class="wp-caption-text"></p></div> <p>The local maximum is at (79 | 133) and the local minimum is at (131 | 20).</p> <h2>Form equations</h2> <p>A cubic function generally looks like this: <code>$f(x) = a \cdot x^3 + b \cdot x^2 + c \cdot x + d$</code></p> <p>You have two points, so they have to fit to this equation: (I) <code>$f(79) = 133$</code> (II) <code>$f(131) = 20$</code></p> <p>The derivative has to be zero in a minimum and a maximum, so you know two more equations: (III) <code>$f&#39;(79) = 0$</code> (IV) <code>$f&#39;(131) = 0$</code></p> <p>Four linear equations and four variables. Now we can solve those equations.</p> <h2>Get explicit equations</h2> <p>As a first step, we write down the equations in an explicit form. You have to know the general derivate of a cubic function: <code>$f&#39;(x) = 3 a\cdot x^2 + 2 b \cdot x + c$</code></p> <p>(I) <code>$493039a + 6241b+79c + d = 133$</code> (II) <code>$2352637a + 17689b + 131c + d = 20$</code> (III) <code>$18723a + 158 b + c = 0$</code> (IV) <code>$51483 a + 262 b + c = 0$</code></p> <h2>Solve the equations</h2> <p>Now you have to solve the equations. I took <a href="http://www.wolframalpha.com/input/?i=493039*a%2B6241*b%2B79*c%2Bd%3D133%2C+2352637*a%2B17689*b%2B131*c%2Bd%3D20%2C+18723*a%2B158*b%2Bc%3D0%2C+51483*a%2B262*b%2Bc%3D0">Wolfram|Alpha</a>, because the numbers are really ugly. If you like to do it by hand, you have to know how to use the <a href="http://en.wikipedia.org/wiki/Gaussian_elimination">Gaussian algorithm</a>.</p> <p>Here is the exact solution: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/wolframalpha-solution-cubic-function.png"><img src="../images/2012/08/wolframalpha-solution-cubic-function.png" alt="" width="512" height="70" class="size-full wp-image-42461"/></a><p class="wp-caption-text"></p></div></p> <p>And here is an approximation: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/wolframalpha-aproximate-form.png"><img src="../images/2012/08/wolframalpha-aproximate-form.png" alt="" width="512" height="57" class="size-full wp-image-42471"/></a><p class="wp-caption-text"></p></div></p> <h2>The LaTeX Code</h2> <div class="highlight"><pre><code class="text">\documentclass{article} \usepackage[pdftex,active,tightpage]{preview} \setlength\PreviewBorder{2mm} \usepackage{pgfplots} \usepackage{units} \pgfplotsset{compat=1.3}% &lt;-- moves axis labels near ticklabels % (respects tick label widths) \usepackage{tikz} \usetikzlibrary{arrows, positioning, calc, intersections, decorations.markings} \usepackage{xcolor} \definecolor{horizontalLineColor}{HTML}{008000} \definecolor{verticalLineColor}{HTML}{FF0000} \begin{document} % Define this as a command to ensure that it is same in both cases \newcommand*{\ShowIntersection}[2]{ \fill [name intersections={of=#1 and #2, name=i, total=\t}] [red, opacity=1, every node/.style={above left, black, opacity=1}] \foreach \s in {1,...,\t}{(i-\s) circle (2pt) node [above left] {\s}}; } \begin{preview} \begin{tikzpicture} \begin{axis}[ label distance=0mm, width=8cm, height=7cm, % size of the image xmin= 40, % start the diagram at this x-coordinate xmax= 180, % end the diagram at this x-coordinate ymin=60, % start the diagram at this y-coordinate ymax=170, % end the diagram at this y-coordinate ylabel=y, xlabel=x, axis lines=left, tick style={draw=none}, xticklabels={,,}, yticklabels={,,} ] \addplot[name path global=a, domain=55:161, dotted, blue, thick,samples=500, label=`$y=f(x)$`] {113/132078*x*x*x-11865/44026*x*x+1169437/44026*x-93155207/132078}; % ( 55 | 82.7344) and (161 | 156.011) are on the graph \coordinate (b) at (axis cs: 55,170); \coordinate (c) at (axis cs:161,170); \coordinate (d) at (axis cs:161,82.7344); \coordinate (e) at (axis cs:161,156.011); \coordinate (a1) at (axis cs:55,111.494); \coordinate (a2) at (axis cs:161,111.494); \draw[verticalLineColor, thick, &lt;-&gt;](a1) -- (a2); \draw[verticalLineColor,dashed](b |- 0,0) -- (b); \draw[verticalLineColor,dashed](c |- 0,0) -- (c); \draw[horizontalLineColor,dashed, thick](d -| 0,0) -- (d); \draw[horizontalLineColor,dashed, thick](e -| 0,0) -- (e); % (100 | 111.494) \coordinate (f) at (axis cs:100, 111.494); \draw[red,dashed](f |- 0,0) -- (f); \end{axis} \end{tikzpicture} \end{preview} \end{document} </code></pre></div> <h2>The result</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/08/cubic-function-intermediate-value-theorem.png"><img src="../images/2012/08/cubic-function-intermediate-value-theorem.png" alt="" width="500" height="383" class="size-full wp-image-42491"/></a><p class="wp-caption-text"></p></div> Konvergenz von Folgen http://martin-thoma.com/konvergenz-von-folgen Sun, 26 Aug 2012 16:04:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/konvergenz-von-folgen <div class="definition">Sei `$(a_n)$` eine Folge. `$(a_n)$` hei&szlig;t <strong>konvergent</strong> `$:\Leftrightarrow \exists_{a \in \mathbb{R}} \forall_{ \varepsilon > 0} \exists_{n_0 = n_0(\varepsilon) \in \mathbb{N}}: |a_n - a | < \varepsilon~~~\forall n \geq n_0$`. In diesem Fall hei&szlig;t a der <strong>Grenzwert</strong> von `$(a_n)$` und man schreibt: `$\displaystyle \lim_{n \rightarrow \infty} (a_n) = a$`. Ist `$(a_n)$` nicht konvergent, so hei&szlig;t `$(a_n)$` <strong>divergent</strong>.</div> <p>Ich werde im Folgendem ein paar wichtige Hinweise geben, wie man konvergenz oder gegebenenfalls divergenz zeigen kann.</p> <h2>Wichtige Folgen</h2> <h3>Konvergent</h3> <p><code>$\displaystyle e := \lim_{n \rightarrow \infty}(1+\frac{1}{n})^n = \lim_{n \rightarrow \infty} \sum_{k=0}^n \frac{1}{n!}$</code>.</p> <p><code>$\displaystyle \lim_{n \rightarrow \infty} \frac{1}{n} = 0$</code>.</p> <p><code>$\displaystyle \lim_{n \rightarrow \infty} \sqrt[n]{c} = 1$</code>, mit <code>$c &gt; 0$</code>.</p> <p><code>$\displaystyle \lim_{n \rightarrow \infty} \sqrt[n]{n} = 1$</code>.</p> <h3>Divergent</h3> <p><code>$a_n = n$</code>.</p> <p><code>$a_n = (-1)^n$</code></p> <h2>Beschr&auml;nktheit und Monotonie</h2> <p>Wenn man zeigen kann, dass eine Folge beschr&auml;nkt ist und monoton steigt oder f&auml;llt (und die Schranke in der richtigen Richtung liegt), dann konvergiert die Folge.</p> <p><strong>Beispiel:</strong> <div class="example">Sei <code>$(a_n)_{n \in \mathbb{N}}$</code> eine Folge und definiert durch <code>$a_n := 2 + \frac{1}{n}$</code>.</p> <p>0 ist eine untere Schranke f&uuml;r <code>$(a_n)_{n \in \mathbb{N}}$</code>: <code>$\underbrace{2}_{\geq 0} + \underbrace{\frac{1}{n}}_{\geq 0} \Rightarrow a_n \geq 0$</code></p> <p><code>$(a_n)_{n \in \mathbb{N}}$</code> ist monoton fallend: Beweis von <code>$a_n \geq a_{n+1} ~~~ \forall_{n \in \mathbb{N}}$</code>:</p> <p><code>$\begin{align} 1 &amp; \geq 0 ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow 2n^2 + 3n + 1 &amp; \geq 2 n^2 + 3n ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow 2n^2 + n + 2n + 1 &amp; \geq n \cdot (2n + 3) ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow (2n + 1) \cdot (n+1) &amp; \geq n \cdot (2n + 2 + 1) ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow \frac{2n+1}{n} &amp; \geq \frac{2 \cdot(n+1)+1}{n+1} ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow 2 + \frac{1}{n} &amp; \geq 2 + \frac{1}{n+1} ~~~ \forall_{n \in \mathbb{N}^+} \\ \Leftrightarrow a_n &amp; \geq a_{n+1}~~~ \forall_{n \in \mathbb{N}^+} \end{align}$</code></p> <p><code>$(a_n)_{n \in \mathbb{N}}$</code> ist also monoton fallend und hat eine untere Schranke. <code>$(a_n)_{n \in \mathbb{N}}$</code> konvergiert also.</p> <p><em>Beachte</em>: Ich habe nicht die gr&ouml;&szlig;te untere Schranke gew&auml;hlt. Hatte ich das gemacht (und bewiesen, dass es keine gr&ouml;&szlig;ere untere Schranke gibt), dann h&auml;tte ich sogar den Grenzwert bestimmt.</div></p> <h2>Cauchy-Folgen</h2> <p>In Banachr&auml;umen kann man auch nachweisen, dass eine Folge eine Cauchy-Folge ist um Konvergenz zu zeigen. Sie muss dazu dieser Bedingung gen&uuml;gen:</p> <p><code>$\forall_{\varepsilon &gt; 0} \exists_{n_0 \in \mathbb{N}}: \forall_{n,m\in\mathbb{N}, n&gt;n_0, m&gt;n_0}: |a_m- a_n| &lt; \varepsilon$</code></p> <p><strong>Beispiel:</strong> Mir f&auml;llt gerade kein Beispiel ein, bei dem man die Konvergenz sch&ouml;ner &uuml;ber das Cauchy-Kriterium zeigen kann als &uuml;ber die Beschr&auml;nktheit / Monotonie. Falls dir eines einf&auml;llt, kannst du es ja in den Kommentar schreiben. (mit <span class="code">&#091;latex&#093; \lim_{n \rightarrow \infty} 123 &#091;/latex&#093;</span> wird es auch als LaTeX dargestellt ;-))</p> <h2>Weiteres</h2> <p>Bei Polynomen darf man den &quot;Ausklammer-Trick&quot; nicht vergessen: <code>$a_n = \frac{3 \cdot n^5 + 2 \cdot n^2 + 42}{1000 \cdot n^5 + n^3} = \frac{n^5}{n^5} \cdot \frac{3 + 2 \cdot \frac{1}{n^3} + 42 \cdot \frac{1}{n^5}}{1000 + \frac{1}{n^2}}= \frac{3 + 2 \cdot \frac{1}{n^3} + 42 \cdot \frac{1}{n^5}}{1000 + \frac{1}{n^2}}$</code></p> <p>Das sieht zwar deutlich schlimmer aus als vorher, ist aber besser. Wir wissen, dass <code>$\displaystyle \lim_{n \rightarrow \infty} \frac{1}{n} = 0$</code> gilt. Also gilt:</p> <p><code>$\displaystyle a_n \xrightarrow{n \rightarrow \infty} \frac{3 + 2 \cdot \overbrace{\frac{1}{n^3}}^{\rightarrow 0} + 42 \cdot \overbrace{\frac{1}{n^5}}^{\rightarrow 0}}{1000 + \underbrace{\frac{1}{n^2}}_{\rightarrow 0}} = \frac{3}{1000}$</code></p> Peg Solitaire http://martin-thoma.com/peg-solitaire Sun, 19 Aug 2012 15:00:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/peg-solitaire <p>Solit&auml;r (auch Solitaire, Steck- oder Solohalma, Springer, Jumper, Nonnenspiel, Einsiedlerspiel) ist ein Brettspiel f&uuml;r eine Person. Das weitest verbreitete Spielfeld ist kreuzf&ouml;rmig und wird mit 32 Steinen auf 33 Felder gestartet. In der Mitte fehlt die Kugel, alle anderen 32 Felder sind besetzt.</p> <h2>Die Bezeichnungen</h2> <div style="width: 300px" class="wp-caption alignright"><a href="../images/2012/08/Peg-solitaire-board.png"><img src="../images/2012/08/Peg-solitaire-board.png" alt="" width="300" height="300" class=" wp-image-41441 "/></a><p class="wp-caption-text"></p></div> <p>Dieses Brett ist hier mit den Bezeichnungen f&uuml;r die Felder dargestellt. Der Buchstabe bezeichnet das Feld (<strong>o</strong>ben, <strong>u</strong>nten, <strong>l</strong>inks, <strong>r</strong>echts, <strong>m</strong>ittig) und die Zahl die genaue Position, wenn man das Brett so dreht, dass das aktuelle Feld oben nur zwei Kugeln hat, sind in der obersten Zeile die Zahlen 1 und 2, in der mittigen 3, 4 und 5 und in der untersten 6, 7 und 8: <h2>Die Regeln</h2> Es gibt vier verschiedene Spielz&uuml;ge: Der Sprung nach oben, unten, links und rechts. Es muss immer mit einer Kugel &uuml;ber eine andere Kugel auf ein freies Feld gesprungen werden.</p> <h2>Aufgabenstellung</h2> <p>Wie muss man ziehen, damit die letzte Kugel in der Mitte ubrig bleibt? <h2>Die L&ouml;sung</h2> Der erste Zug muss mit einer 2er-Kugel gemacht werden. Sagen wir, es ist o4. <table> <tbody> <tr> <td>l3</td> <td>u3</td> <td>r3</td> <td>o3</td> </tr> <tr> <td>o8</td> <td>l8</td> <td>u8</td> <td>r8</td> </tr> <tr> <td>o6</td> <td>l6</td> <td>u6</td> <td>r6</td> </tr> <tr> <td>l1</td> <td>u1</td> <td>r1</td> <td>o1</td> </tr> <tr> <td>o8</td> <td>l8</td> <td>u8</td> <td>r8</td> </tr> </tbody> </table> Die momentane Situation sieht folgenderma&szlig;en aus:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/08/Peg-solitaire-board-situation-1.png"><img src="../images/2012/08/Peg-solitaire-board-situation-1.png" alt="" width="300" height="300" class="wp-image-41461 "/></a><p class="wp-caption-text"></p></div> <p>Nun kann man u1 einmal im Krei (auf r3, r5, o1, l3, l5 und dann wieder auf u1) wandern lassen. Es bleibt eine T-Form &uuml;brig:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/08/Peg-solitaire-board-situation-2.png"><img src="../images/2012/08/Peg-solitaire-board-situation-2.png" alt="" width="300" height="300" class=" wp-image-41491 "/></a><p class="wp-caption-text"></p></div> <p>Nun muss nur noch m &uuml;ber l1, dann u4, r1 und schlie&szlig;lich l4.</p> Jordansche Normalform: 2x2 Matrizen http://martin-thoma.com/jordansche-normalform-2x2-matrizen Fri, 17 Aug 2012 19:49:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/jordansche-normalform-2x2-matrizen <div class="info">Hier sind `$2 \times 2$` Beispiele zum Hauptartikel <a href="../wie-berechnet-man-die-jordansche-normalform/" title="Wie berechnet man die Jordan&rsquo;sche Normalform?">Wie berechnet man die Jordan&rsquo;sche Normalform?</a>.</div> <h2>Beispiel 1</h2> <p>Gegeben sei die Matrix <code>$A \in \mathbb{R}^{2 \times 2}$</code>: <code>$A := \begin{pmatrix} 11 &amp; -4\\ 25 &amp; -9 \end{pmatrix}$</code>.</p> <h3>Jordannormalform bestimmen</h3> <p><strong>1. Charakteristisches Polynom berechnen:</strong> <code>$p_A(\lambda) = (\lambda - 1)^2$</code>.</p> <p>Daraus folgt: <code>$\lambda = 1$</code> ist einziger Eigenwert <code>$\Rightarrow$</code> 1 Jordanblock</p> <p><strong>2. Anzahl der Jordank&auml;stchen bestimmen:</strong></p> <p><code>$ \begin{align} \dim E_{1} &amp;= \dim \text{Kern}(A -1 \cdot I) \\ &amp;= \dim \text{Kern} \begin{pmatrix} 10 &amp; -4\\ 25 &amp; -10 \end{pmatrix}\\ &amp;= \dim \text{Kern} \begin{pmatrix} 10 &amp; -4\\ 0 &amp; 0 \end{pmatrix}\\ &amp;= \dim \left [ \begin{pmatrix}2\\5\end{pmatrix} \right ] \\ &amp;= 1 \end{align}$</code></p> <p><code>$\Rightarrow$</code> es gibt genau 1 Jordank&auml;stchen in diesem Jordanblock.</p> <p><code>$\Rightarrow J = \begin{pmatrix}1 &amp; 1\\ 0 &amp; 1 \end{pmatrix}$</code>.</p> <h3>Basiswechselmatrix bestimmen</h3> <p><strong>Basisvektoren f&uuml;r den Eigenwert 1 bestimmen:</strong> <code>$\Omega = \Phi_{| H_\lambda} - \lambda \cdot id = \begin{pmatrix} 10 &amp; - 4\\ 25 &amp; -10 \end{pmatrix} $</code>,</p> <p><code>$K_1 = \text{Kern } \Omega^1 = \left [ \begin{pmatrix}2 \\ 5 \end{pmatrix} \right ]$</code></p> <h1>`$K_2 = \text{Kern } \Omega^2 = \text{Kern } (\begin{pmatrix}10 &amp; -4\ 25 &amp; -10 \end{pmatrix} \cdot \begin{pmatrix}10 &amp; -4\ 25 &amp; -10 \end{pmatrix}) = \text{Kern } (\begin{pmatrix}0 &amp; 0\ 0 &amp; 0 \end{pmatrix}) </h1> <p>\left[ \begin{pmatrix}1 \ 0 \end{pmatrix}, \begin{pmatrix}0 \ 1 \end{pmatrix} \right]$`</p> <p><code>$K_2 \stackrel{!}{=} U_1 \oplus K_1 \Rightarrow \left [ \begin{pmatrix} 1 \\ 0 \end{pmatrix} \right ] ~~~ U_0 = K_1$</code></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/08/jordan-normal-form-scheme-small.png"><img src="../images/2012/08/jordan-normal-form-scheme-small.png" alt="" width="300" height="116" class="size-full wp-image-40961"/></a><p class="wp-caption-text"></p></div> <p>W&auml;hle <code>$b_1^1 \in U_1: b_1^1 = \begin{pmatrix}1 \\0 \end{pmatrix} \Rightarrow \Omega(b_1^1) = \begin{pmatrix}10 \\ 25 \end{pmatrix}$</code> <code>$\Rightarrow S = \begin{pmatrix} 10 &amp; 1 \\ 25 &amp; 0 \end{pmatrix}$</code> <code>$\Rightarrow S^{-1} = \begin{pmatrix} 0 &amp; \frac{1}{25} \\ 1 &amp; -\frac{2}{5} \end{pmatrix}$</code></p> <p><code>$A = S \cdot J \cdot S^{-1}$</code> `$\Leftrightarrow \begin{pmatrix} 11 &amp; -4\ 25 &amp; -9</p> <h1>\end{pmatrix}</h1> <p>\begin{pmatrix} 10 &amp; 1 \ 25 &amp; 0 \end{pmatrix} \cdot \begin{pmatrix}1 &amp; 1\ 0 &amp; 1 \end{pmatrix} \cdot \begin{pmatrix} 0 &amp; \frac{1}{25} \ 1 &amp; -\frac{2}{5} \end{pmatrix}$`</p> <h2>Beispiel 2</h2> <p>Gegeben sei die Matrix <code>$A \in \mathbb{R}^{2 \times 2}$</code>: <code>$A := \begin{pmatrix} 1 &amp; 2\\ 3 &amp; 6 \end{pmatrix}$</code>.</p> <h3>Jordannormalform bestimmen</h3> <p><strong>1. Charakteristisches Polynom berechnen:</strong> <code>$p_A(\lambda) = \det \begin{pmatrix} 1 -\lambda &amp; 2\\ 3 &amp; 6 - \lambda \end{pmatrix} = (1- \lambda) \cdot (6 - \lambda) - 6 = 6-6\lambda-\lambda+\lambda^2-6=\lambda^2-7\lambda = \lambda \cdot (\lambda - 7)$</code> Daraus folgt: 0 und 1 sind Eigenwerte. Sie haben jeweils die algebraischen Vielfachheit 1. Daraus folgt: Die Jordansche Normalform hat genau zwei Jordanbl&ouml;cke, die beide die Gr&ouml;&szlig;e 1x1 haben. Daraus folgt: Beide Jordanbl&ouml;cke haben genau ein Jordank&auml;stchen der Gr&ouml;&szlig;e 1x1. Daraus folgt: Die Jordansche Normalform der Matrix ist:</p> <p><code>$J = \begin{pmatrix} 0 &amp; 0\\ 0 &amp; 7 \end{pmatrix}$</code></p> <h3>Basiswechselmatrix bestimmen</h3> <p><strong>Basisvektoren f&uuml;r den Eigenwert 0 bestimmen:</strong> <code>$K_1 = \text{Kern }(A- 0 \cdot E) = \text{Kern } \begin{pmatrix} 1 &amp; 2\\ 3 &amp; 6 \end{pmatrix} = \left [ \begin{pmatrix}2 \\ -1 \end{pmatrix} \right ] $</code></p> <p><strong>Basisvektoren f&uuml;r den Eigenwert 7 bestimmen:</strong> <code>$K_1 = \text{Kern }(A- 7 \cdot E) = \text{Kern } \begin{pmatrix} -6 &amp; 2\\ 3 &amp; -1 \end{pmatrix} = \text{Kern } \begin{pmatrix} 1 &amp; -\frac{1}{3}\\ 0 &amp; 0 \end{pmatrix} = \left [ \begin{pmatrix}1 \\ 3 \end{pmatrix} \right ] $</code></p> <p><strong>Zusammensetzen:</strong> <code>$S = \begin{pmatrix}2 &amp; 1 \\ -1 &amp; 3 \end{pmatrix}$</code> <code>$S^{-1} = \frac{1}{7} \cdot \begin{pmatrix}3 &amp; -1 \\ 1 &amp; 2 \end{pmatrix}$</code></p> <h3>Anmerkung</h3> <p>Man h&auml;tte &uuml;brigens jeden Vektor aus <code>$\left [ \begin{pmatrix}2 \\ -1 \end{pmatrix} \right ] $</code> nehmen k&ouml;nnen. Angenommen, man h&auml;tte den Vektor <code>$\begin{pmatrix}-14 \\ 7 \end{pmatrix}$</code> gew&auml;hlt:</p> <p><code>$S = \begin{pmatrix}-14 &amp; 1 \\ 7 &amp; 3 \end{pmatrix}$</code> <code>$S^{-1} = \frac{1}{49} \cdot \begin{pmatrix}-3 &amp; 1 \\ 7 &amp; 14 \end{pmatrix}$</code></p> <p>Das gleiche gilt nat&uuml;rlich f&uuml;r jeden anderen gew&auml;hlten Vektor. Die inverse Matrix &auml;ndert sich selbstverst&auml;ndlich, jedoch nicht die Jordansche Normalform oder die urspr&uuml;ngliche Matrix.</p> Wie berechnet man die Jordan'sche Normalform? http://martin-thoma.com/wie-berechnet-man-die-jordansche-normalform Fri, 17 Aug 2012 10:59:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-berechnet-man-die-jordansche-normalform <p>Dieser Artikel beschreibt, wie die Jordansche Normalform einer Matrix sowie die dazugeh&ouml;rige Basiswechselmatrix gefunden werden kann. Dabei wird hier eine Jordansche Normalform erzeugt, bei der die 1er auf der oberen Nebendiagonale sind und die gr&ouml;&szlig;ten Jordank&auml;stchen zuerst kommen.</p> <p>Ich werde hier nicht erkl&auml;ren, warum es so funktioniert.</p> <p>Hier sind zwei <a href="../jordansche-normalform-2x2-matrizen/" title="Jordansche Normalform: 2&times;2 Matrizen">Beispiele mit 2x2-Matrizen</a> und <a href="../jordansche-normalform-4x4-matrizen/" title="Jordansche Normalform: 4&times;4 Matrizen">Beispiele mit 4x4-Matrizen</a>.</p> <p>Gegeben sei eine Matrix <code>$A \in \mathbb{C}^{n \times n}$</code>.</p> <h2>Berechnung der Jordanschen Normalform</h2> <h3>Charakteristisches Polynom bestimmen</h3> <p>Als ersten Schritt muss man das charakteristische Polynom <code>$p_A(\lambda)$</code> der Matrix <code>$A$</code> bestimmen.</p> <p>&rarr; <a href="../wie-berechnet-man-das-charakteristische-polynom/" title="Wie berechnet man das charakteristische Polynom?">Wie berechnet man das charakteristische Polynom?</a></p> <h3>Zerlegung in Linearfaktoren</h3> <p>Die Zerlegung des charakteristischen Polynoms <code>$p_A(\lambda)$</code> in Linearfaktoren kann ziemlich schwer sein. Daf&uuml;r muss man unbedingt die Mitternachtsformel <code>$\lambda_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$</code> k&ouml;nnen und eventuell wissen, wie eine <a href="http://de.wikipedia.org/wiki/Polynomdivision#Manueller_Ablauf">Polynomdivision</a> funktioniert. Eventuell muss man dazu auch Nullstellen erraten. Wenn es ums raten geht, w&uuml;rde ich folgendes ausprobieren: 0, 1, -1, 2, -2, 3, -3.</p> <p>Sobald man diese Zerlegung hat, kann man die Eigenwerte und die algebraische Vielfachheit der Eigenwerte direkt ablesen. Die Eigenwerte stehen in der Jordanmatrix auf der Diagonalen. Die algebraische Vielfachheit entspricht der Seitenl&auml;nge des quadratischen Jordanblocks.</p> <h3>Anzahl der Jordank&auml;stchen bestimmen</h3> <p>Jeder Eigenwert hat genau einen Jordanblock. Jeder Jordanblock hat wiederum Jordank&auml;stchen. Das sieht so aus:</p> <p><code>$ J = \left( \begin{array}{*4{c}} A_{\lambda_1} &amp; &amp; &amp; 0\\ &amp; A_{\lambda_2} &amp; &amp; \\ &amp; &amp; \ddots &amp; \\ 0 &amp; &amp; &amp; A_{\lambda_k} \end{array} \right)$</code></p> <p><code>$A_{\lambda_i}$</code> sind die Jordanbl&ouml;cke zu den Eigenwerten <code>$\lambda_i$</code>.</p> <p>Die Einzelnen Jordanbl&ouml;cke schauen etwa so aus: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/08/jordan-normal-form-block.png"><img src="../images/2012/08/jordan-normal-form-block.png" alt="" width="500" height="260" class="size-full wp-image-40381"/></a><p class="wp-caption-text"></p></div></p> <p>Jedes Jordank&auml;stchen ist quadratisch, hat auf der Diagonalen den Eigenwert und auf der oberen Nebendiagonale 1er. Sonst sind nur 0er im Jordank&auml;stchen. Au&szlig;erhalb der Jordank&auml;stchen sind im Jordanblock nur 0er. Insbesondere k&ouml;nnen also auf der oberen Nebendiagonalen des Jordanblocks 0er stehen!</p> <p>Es gilt: <code>$\text{geometrische Vielfachheit des Eigenwertes } \lambda := \dim E_\lambda \leq \text{algebraische Vielfachheit des Eigenwertes } \lambda$</code> <code>$\dim E_\lambda = \dim \text{Kern}(A - \lambda \cdot I) = \text{Anzahl der Jordank&amp;auml;stchen im Jordanblock zu } \lambda$</code></p> <p>&rarr; <a href="../wie-bestimme-ich-den-kern-einer-linearen-abbildung/" title="Wie bestimme ich den Kern einer linearen Abbildung?">Wie bestimme ich den Kern einer linearen Abbildung?</a></p> <p>Au&szlig;erdem gilt: Die Gr&ouml;&szlig;e des gr&ouml;&szlig;ten Jordank&auml;stchens zum Eigenwert <code>$\lambda_i$</code> ist gleich der Potenz, mit der der Linearfaktor <code>$(x-\lambda_i)$</code> im Minimalpolynom (leider NICHT das charakteristische Polynom :-( ) vorkommt.</p> <p>Nun kann man h&auml;ufig schon schlussfolgern, welche Gr&ouml;&szlig;e die einzelnen Jordank&auml;stchen haben. Zus&auml;tzlich haben &auml;hnliche Matrizen die gleiche Spur, die gleiche Determinante und den gleichen Rang. Das k&ouml;nnte helfen um &quot;falsche&quot; Jordanmatrizen auszuschlie&szlig;en.</p> <p>Damit ist die Jordansche Normalform der Matrix h&auml;ufig schon bestimmt.</p> <h3>Gr&ouml;&szlig;e der Jordank&auml;stchen bestimmen</h3> <p>Sei <code>$\Omega = \Phi - \lambda \cdot id$</code> und <code>$K_k = \text{Kern } ((\Omega)^k)$</code></p> <p>Man w&auml;hle <code>$q \in N^+$</code> so, dass <code>$\dim K_q = \dim K_{q+1} = \dim K_{q+2} = ... = \dim V$</code> und q minimal. Dann gilt: q ist die l&auml;nge des gr&ouml;&szlig;ten Jordank&auml;stchens in dem Jordanblock (und au&szlig;erdem der Exponent im Minimalpolynom zum betrachteten Eigenwert <code>$\lambda$</code>).</p> <p>Es sei <code>$a_0 = \dim K_0 = 0, a_1 = \dim K_1, a_i = \dim K_i$</code> mit <code>$i \in 0, ..., q$</code>.</p> <p>Es gilt: <ul> <li>Anzahl der K&auml;stchen der Gr&ouml;&szlig;e <code>$1 \times 1$</code>: <code>$2 \cdot a_1 - a_0 - a_2$</code></li> <li>Anzahl der K&auml;stchen der Gr&ouml;&szlig;e <code>$2 \times 2$</code>: <code>$2 \cdot a_2 - a_1 - a_3$</code></li> <li>Anzahl der K&auml;stchen der Gr&ouml;&szlig;e <code>$3 \times 3$</code>: <code>$2 \cdot a_3 - a_2 - a_4$</code></li> <li>Anzahl der K&auml;stchen der Gr&ouml;&szlig;e <code>$i \times i$</code>: <code>$2 \cdot a_i - a_{i-1} - a_{i+1}$</code></li> </ul></p> <h2>Berechnung der Basiswechselmatrix</h2> <p>Die Basiswechselmatrix wird manchmal auch Transformationsmatrix genannt. Es ist die invertierbare Matrix S, f&uuml;r die gilt: <code>$A = S \cdot J \cdot S^{-1}$</code></p> <h3>Kerne bestimmen</h3> <p>Bestimme <code>$K_1, K_2, K_3, ... , K_q$</code>, wobei <code>$\dim K_{q-1} &lt; \dim K_q = \dim K_{q+1} = \dim K_{q+2} ...$</code> gilt. Man kann also bei <code>$K_q$</code> aufh&ouml;ren.</p> <p>F&uuml;r jedes <code>$K_k$</code> mit <code>$k \in 1, ..., q$</code> bestimmt man eine m&ouml;glichst einfache Basis.</p> <h3>Zusammensetzen</h3> <p>An dieser Stelle sollte man wissen, wie gro&szlig; die Jordank&auml;stchen sind.</p> <p>F&uuml;r ein Jordank&auml;stchen der Gr&ouml;&szlig;e <code>$i$</code> w&auml;hlt man einen Basisvektor <code>$v_i$</code> aus <code>$K_i$</code>, der jedoch nicht in <code>$K_{i-1}$</code> liegt. Die restlichen <code>$i-1$</code> Vektoren f&uuml;r dieses K&auml;stchen erh&auml;lt man, indem man die Abbildungsmatrix von <code>$\Omega^{j}$</code>, mit <code>$j = 1, ..., i-1$</code>, mit <code>$v_i$</code> multipliziert. </p> <p>Also: <code>$v_j = (A - \lambda \cdot E)^{i-j}$</code> mit <code>$j = 1, ..., i$</code></p> <p>Die Vektoren <code>$v_j$</code> schreibt man mit aufsteigenden Indizes in die geordete Basis. Beachte: Man w&auml;hlt nur den Vektor <code>$v_i$</code>, alle anderen Vektoren f&uuml;r dieses K&auml;stchen sind dadurch festgelegt! Au&szlig;erdem schreibt man <code>$v_i$</code> erst am Ende in die Basis!</p> <h3>Inverse Matrix bestimmen</h3> <p>Sobald man <code>$S$</code> bestimmt hat, muss man nur noch das Inverse davon bestimmen: &rarr; <a href="../wie-bestimme-ich-das-inverse-einer-matrix/" title="Wie bestimme ich das Inverse einer Matrix?">Wie bestimme ich das Inverse einer Matrix?</a></p> <h2>Interessante Eigenschaften der JNF</h2> <p>Im Zusammenhang mit der JNF (und einigen Klausuraufgaben) sind mir ein paar erw&auml;hnenswerte Eigenschaften aufgefallen:</p> <p><strong>Die Anzahl der Jordank&auml;stchen zum Eigenwert <code>$\lambda = 0$</code> ist <code>$n - \text{Rang}(A)$</code>.</strong> <em>Begr&uuml;ndung</em>: Die Anzahl der Jordank&auml;stchen zum Eigenwert <code>$\lambda$</code> ist gleich der Dimension des Eigenraumes von <code>$\lambda$</code>. Der Eigenraum zum Eigenwert 0 hat die besonderheit, dass es der Kern ist. Nach der Dimensionsformel gilt: <code>$\dim \text{Kern}(\Phi) + \dim \text{Bild}(\Phi) = n = \dim \text{Kern} + \text{ Rang}(A_\Phi)$</code>.</p> Java Puzzle #10: Multiple Interfaces http://martin-thoma.com/java-puzzle-10-multiple-interfaces Thu, 16 Aug 2012 15:00:25 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-10-multiple-interfaces <p>You have to following source code:</p> <p><strong>A.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">A</span> <span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">methodA</span><span class="o">(</span><span class="kt">double</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">,</span> <span class="kt">char</span> <span class="n">c</span><span class="o">);</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">methodB</span><span class="o">();</span> <span class="o">}</span> </code></pre></div> <p><strong>B.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">B</span> <span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">methodB</span><span class="o">();</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">methodC</span><span class="o">();</span> <span class="o">}</span> </code></pre></div> <p><strong>test.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="kd">implements</span> <span class="n">A</span><span class="o">,</span> <span class="n">B</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">test</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">test</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">methodA</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="sc">&#39;3&#39;</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">methodB</span><span class="o">());</span> <span class="n">t</span><span class="o">.</span><span class="na">methodC</span><span class="o">();</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">methodA</span><span class="o">(</span><span class="kt">double</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">,</span> <span class="kt">char</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">42</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">int</span> <span class="nf">methodB</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">1337</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">methodC</span><span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;methodC executed.&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>What is the output? Does it compile? Is there a <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html">RuntimeException</a>?</p> <p>. . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <p>Output:</p> <div class="highlight"><pre><code class="bash">42 1337 methodC executed. </code></pre></div> <h2>Explanation</h2> <p>If you use an Interface, it simply means you have to implement some methods. If more than one Interface forces you to implement the method, you still have to implement it only once. It just works fine.</p> Wie bestimme ich den Kern einer linearen Abbildung? http://martin-thoma.com/wie-bestimme-ich-den-kern-einer-linearen-abbildung Thu, 16 Aug 2012 13:54:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-bestimme-ich-den-kern-einer-linearen-abbildung <h2>Definition</h2> <p>Der Kern einer linearen Abbildung ist eine Menge von Vektoren. In diesem Artikel erkl&auml;re ich kurz und b&uuml;ndig, wie man den Kern einer linearen Abbildung bestimmt.</p> <div class="definition">Sei `$\Phi: V \rightarrow W$` eine lineare Abbildung. Der <strong>Kern</strong> von `$\Phi$` ist die Menge aller Vektoren von V, die durch `$\Phi$` auf den Nullvektor `$0 \in W$` abgebildet werden, also: `$\text{Kern } \Phi := \{v \in V | \Phi(v) = 0\}$`</div> <h2>Vorgehen</h2> <p>Jede lineare Abbildung <code>$\Phi$</code> l&auml;sst sich in dieser Form beschreiben:</p> <p><code>$\Phi: V \rightarrow W$</code> mit <code>$\dim V = m$</code> und <code>$\dim W = n$</code> <code>$\Phi(x) = A \cdot x, ~~~ A \in R^{n \times m}, x \in V$</code></p> <p>Also muss man, um den Kern von <code>$\Phi$</code> zu bestimmen, nur das folgende homogene Gleichungssystem nach x aufl&ouml;sen: <code>$A \cdot x = 0$</code></p> <p>In Wolfram|Alpha ben&ouml;tigt man daf&uuml;r &uuml;brigens das Schl&uuml;sselwort <code>null space</code>. Hier ist <a href="http://www.wolframalpha.com/input/?i=nullspace+%7B%7B-1%2C-1%2C-2%2C-2%2C-1%7D%2C%7B3%2C0%2C2%2C1%2C2%7D%2C%7B0%2C1%2C1%2C1%2C0%7D%2C%7B-1%2C-1%2C-2%2C-2%2C-1%7D%2C%7B2%2C1%2C3%2C3%2C2%7D%7D">Beispiel #2 in Wolfram|Alpha</a>.</p> <h2>Beispiel #1</h2> <h3>Aufgabenstellung</h3> <p>Sei <code>$A \in \mathbb{R}^{3 \times 3}$</code> und definiert als</p> <p><code>$A := \begin{pmatrix} 1 &amp; 2 &amp; 3\\ 4 &amp; 5 &amp; 6\\ 7 &amp; 8 &amp; 9 \end{pmatrix}$</code></p> <p>Sei <code>$\Phi: \mathbb{R}^3 \rightarrow \mathbb{R}^3$</code> eine lineare Abbildung und definiert als</p> <p><code>$\Phi(x) := A \cdot x$</code>.</p> <p>Was ist der Kern von <code>$\Phi$</code>?</p> <h3>Rechnung</h3> <p><code>$ \begin{pmatrix} 1 &amp; 2 &amp; 3\\ 4 &amp; 5 &amp; 6\\ 7 &amp; 8 &amp; 9 \end{pmatrix} \leadsto \begin{pmatrix} 1 &amp; 2 &amp; 3\\ 0 &amp; -3 &amp; -6\\ 0 &amp; -6 &amp; -12 \end{pmatrix} \leadsto \begin{pmatrix} 1 &amp; 2 &amp; 3\\ 0 &amp; 1 &amp; 2\\ 0 &amp; 1 &amp; 2 \end{pmatrix} \leadsto \begin{pmatrix} 1 &amp; 0 &amp; -1\\ 0 &amp; 1 &amp; 2\\ 0 &amp; 0 &amp; 0 \end{pmatrix} $</code></p> <p>Man sieht direkt, dass die Matrix den Rang 2 hat. Also muss der L&ouml;sungsraum 1-dimensional sein. Mit dem -1-Trick kommt nam auf den L&ouml;sungsraum:</p> <p><code>$\mathcal{L} = \left [ \begin{pmatrix} -1\\ 2\\ -1 \end{pmatrix} \right ]$</code></p> <p>Also:</p> <p><code>$\text{Kern } \Phi = \left [ \begin{pmatrix} -1\\ 2\\ -1 \end{pmatrix} \right ]$</code></p> <h2>Beispiel #2</h2> <h3>Aufgabenstellung</h3> <p>Sei <code>$A \in \mathbb{R}^{5 \times 5}$</code> und definiert als</p> <p><code>$A := \begin{pmatrix} -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 3 &amp; 0 &amp; 2 &amp; 1 &amp; 2\\ 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0\\ -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 2 &amp; 1 &amp; 3 &amp; 3 &amp; 2 \end{pmatrix}$</code></p> <p>Sei <code>$\varphi: \mathbb{R}^5 \rightarrow \mathbb{R}^5$</code> eine lineare Abbildung und definiert als</p> <p><code>$\varphi(x) := A \cdot x$</code>.</p> <p>Was ist der Kern von <code>$\varphi$</code>?</p> <h3>Rechnung</h3> <p><code>$\begin{pmatrix} -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 3 &amp; 0 &amp; 2 &amp; 1 &amp; 2\\ 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0\\ -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 2 &amp; 1 &amp; 3 &amp; 3 &amp; 2 \end{pmatrix} \cdot \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{pmatrix}$</code></p> <p><code>$\leadsto \begin{pmatrix} -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 3 &amp; 0 &amp; 2 &amp; 1 &amp; 2\\ 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0\\ -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 2 &amp; 1 &amp; 3 &amp; 3 &amp; 2 \end{pmatrix} \leadsto \begin{pmatrix} -1 &amp; -1 &amp; -2 &amp; -2 &amp; -1\\ 0 &amp; -3 &amp; -4 &amp; -5 &amp; -4\\ 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; -1 &amp; -1 &amp; -1 &amp; 0 \end{pmatrix}$</code></p> <p><code>$\leadsto \begin{pmatrix} 1 &amp; 1 &amp; 2 &amp; 2 &amp; 1\\ 0 &amp; 1 &amp; 1 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; -1 &amp; -2 &amp; -1\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix} \leadsto \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; -1 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; -1 &amp; -1\\ 0 &amp; 0 &amp; 1 &amp; 2 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \end{pmatrix}$</code></p> <p>Die Matrix hat Rang 3, daraus folgt, dass die Dimension des L&ouml;sungsraumes 2 ist. Wieder &uuml;ber den -1-Trick kann man den L&ouml;sungsraum direkt ablesen:</p> <p>`$\mathcal{L} = \left [ \begin{pmatrix} -1\ -1\ 2\ -1\ 0 \end{pmatrix}, \begin{pmatrix} 0\ -1\ 1\ 0\ -1 \end{pmatrix}</p> <h1>\right ]</h1> <p>\text{Kern} \varphi $`</p> Der Kaiser von China und der Reis http://martin-thoma.com/der-kaiser-von-china-und-der-reis Wed, 15 Aug 2012 15:00:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/der-kaiser-von-china-und-der-reis <p><a href="../images/2012/08/chessboard-rice.png"><img src="../images/2012/08/chessboard-rice.png" alt="" title="Schachbrett mit Reis" width="191" height="128" class="alignright size-full wp-image-46151" /></a> <h2>Aufgabenstellung</h2> Der Kaiser von China spielt mit einem Bauern Schach. Nachdem er das Spiel verloren hat, ist der Kaiser gro&szlig;z&uuml;gig und will dem Bauern jeden Wunsch erf&uuml;llen. Der Bauer gibt sich bescheiden und verlangt f&uuml;r das erste Schachfeld ein Reiskorn, f&uuml;r das zweite zwei Reisk&ouml;rner, usw.</p> <p>Allgemein formuliert verlangt er f&uuml;r jedes Schachfeld doppelt so viele Reisk&ouml;rner wie f&uuml;r das Vorhergehende.</p> <p>Wieviel Reis muss der Kaiser von China abtreten?</p> <h2>L&ouml;sung</h2> <p>Ein Schachbrett hat <code>$8 \cdot 8 = 64$</code> Felder. F&uuml;r das <code>$i$</code>-te Feld, <code>$1 \le i \le 64$</code>, muss der Kaiser <code>$2^{i-1}$</code> Reisk&ouml;rner abgeben. Insgesamt muss er also <code>$\sum_{i=1}^{64} 2^{i-1}$</code> Reisk&ouml;rner abgeben. Das sind <code>$2^{64} - 1 = 18446744073709551615 \approx 1{,}84 \cdot 10^{19}$</code> Reisk&ouml;rner. </p> <h2>Vergleiche</h2> <p>Wie viel sind 18.446.744.073.709.551.615 Reisk&ouml;rner?</p> <h3>Erdabdeckung</h3> <p>W&uuml;rde man die Erde gleichm&auml;&szlig;ig mit Reisk&ouml;rnern abdecken, wie hoch w&auml;re diese Schicht?</p> <p>Die Erde hat eine Oberfl&auml;che von ca. 510 Millionen <code>$\text{km}^2$</code>, ein Basmati-Reiskorn ist ca 6,5 mm lang, hat einen Durchmesser von ca. 1,5 mm und hat vereinfacht eine Kreiszylinderform.</p> <p>Daraus ergibt sich folgende Gleichung, bei der <code>$x$</code> die H&ouml;he der Reisschicht ist:</p> <p><code>$ \begin{align} x \cdot A_{Erde} &amp;= (2^{64}-1) \cdot 6,5\text{mm} \cdot (1,5\text{mm})^2 \cdot \pi \\ x &amp;= \frac{(2^{64}-1) \cdot 6,5\text{mm} \cdot (1,5\text{mm})^2 \cdot \pi}{A_{Erde}} \\ x &amp;= \frac{(2^{64}-1) \cdot 45,9458\text{mm}^3}{510 \cdot 10^6 \cdot 10^{12} \text{mm}^2} \\ x &amp;= \frac{8,47550 \cdot 10^{20} \text{mm}^3}{510 \cdot 10^{18} \text{mm}^2} \\ x &amp;= 1,662\text{mm} \end{align} $</code></p> <p>Die Erde k&ouml;nnte also komplett mit ca. 1,662 mm Reis, also etwas mehr als einem Reiskorn, bedeckt werden.</p> <h3>Reispackungen</h3> <p>Den vorhergehenden Vergleich finde ich noch etwas unpraktisch. Wieviele Reispackungen w&auml;ren das?</p> <p>Eine handels&uuml;bliche Packung Reis beinhaltet ca. 1 kg Reis. Ein Reiskorn wiegt ca. 65 mg.</p> <p><code>$ \begin{align} x &amp;:= \text{Reispackungen} \\ x \cdot 1\text{kg} &amp;= 65\text{mg} \cdot (2^{64}-1) \\ x \cdot 10^6\text{mg} &amp;= 1199038364791120854975\text{mg} \\ x &amp;\approx 1,2 \cdot 10^{15} \end{align} $</code></p> <h3>Reispackungen pro Person</h3> <p>Auch <code>$1,2 \cdot 10^{15}$</code> ist noch zu gro&szlig;, um sich etwas darunter vorstellen zu k&ouml;nnen. Wie viele Reispackungen w&auml;ren das pro Person auf der Erde?</p> <p><code>$ \begin{align} x &amp;:= \text{Reispackungen pro Mensch} \\ x &amp;= \frac{1,2 \cdot 10^{15}}{6,93 \cdot 10^9} \\ x &amp;\approx 1,7 \cdot 10^5 \end{align} $</code> Jeder Mensch w&uuml;rde also 170.000 Packungen Reis von Kaiser von China bekommen. Um den t&auml;glichen Kalorienbedarf zu decken werden ca. 1,1 kg Reis ben&ouml;tigt. Es k&ouml;nnten also alle Menschen der Erde ca. 154.545 Tage, das sind &uuml;ber 423 Jahre, ern&auml;hrt werden!</p> <h3>Marktwert</h3> <p>Reis kostet auf dem Weltmarkt ca. 600 US-Dollar pro metrischer Tonne (<a href="http://www.markt-daten.de/charts/imf/imf014.htm">Quelle</a>).</p> <p><code>$ \begin{align} x &amp;:= \text{Marktwert} \\ x &amp;= \frac{1,2 \cdot 10^{15}}{1000} \cdot 600 \text{ US-Dollar}\\ x &amp;= 720000000000000 \end{align} $</code></p> <p>Der Reis h&auml;tte also einen Marktwert von 720 Billionen US-Dollar.</p> <p>Zum Vergleich: Das BIP der gesamten Welt, also die Summe der Werte aller G&uuml;ter und Dienstleistung, lag 2007 bei ca. 54 Billionen US-Dollar (<a href="http://www.bpb.de/wissen/I6PFEV,0,WeltBruttoinlandsprodukt.html">Quelle</a>).</p> Klausur Analysis I und II http://martin-thoma.com/klausur-analysis-i-und-ii Tue, 14 Aug 2012 15:13:24 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/klausur-analysis-i-und-ii <div class="info">Dieser Artikel richtet sich vor allem an Studenten, die im Sommersemester 2012 bei Herrn Prof. Dr. Schmoeger am KIT die Klausur &uuml;ber Analysis schreiben werden.</div> <h2>Vorbereitung</h2> <h3>Analysis I</h3> <h4>Themen</h4> <ul> <li><strong>Definitionen und Beispiele</strong>: Beschr&auml;nktheit, injektiv, surjektiv, bijektiv, endlich, unendlich, abz&auml;hlbar, &uuml;berabz&auml;hlbar</li> <li><a href="http://de.wikipedia.org/wiki/Bernoullische_Ungleichung">Bernoullische Ungleichung</a>: Ist `$x \geq -1$`, so gilt: `$(1+x)^n \geq 1 + nx~~~\forall n \in \mathbb{N}^+$`</li> <li><a href="http://de.wikipedia.org/wiki/Binomischer_Lehrsatz">Binomischer Lehrsatz</a>: `$(a+b)^n = \sum_{k=0}^{n} \binom{n}{k} a^{n-k} b^k$`</li> <li><strong>Folgen</strong>: <ul> <li><a href="../konvergenz-von-folgen/">Konvergenz</a></li> <li>(strenge) Monotonie</li> <li>Grenzwert</li> <li>Divergenz</li> <li>Konvergenzkriterien: <a href="http://de.wikipedia.org/wiki/Wurzelkriterium">Wurzelkriterium</a>, <a href="http://de.wikipedia.org/wiki/Leibniz-Kriterium">Leibniz-Kriterium</a>, <a href="http://de.wikipedia.org/wiki/Cauchykriterium">Cauchy-Kriterium</a>, <a href="http://de.wikipedia.org/wiki/Majorantenkriterium">Majorantenkriterium</a>, Minorantenkriterium, <a href="http://de.wikipedia.org/wiki/Quotientenkriterium">Quotientenkriterium</a></li> <li><a href="http://de.wikipedia.org/wiki/Eulersche_Zahl">Eulersche Zahl</a>: `$\displaystyle e := \lim_{n \rightarrow \infty}(1+\frac{1}{n})^n = \lim_{n \rightarrow \infty} \sum_{k=0}^n \frac{1}{n!}$`</li> <li>H&auml;ufungswert vs. H&auml;ufungspunkt: &rarr; <a href="http://de.wikipedia.org/wiki/Diskussion:H%C3%A4ufungspunkt#H.C3.A4ufungspunkt_und_H.C3.A4ufungswert">Diskussion</a> <ul> <li>Oberer- und unterer Limes</li> </ul> </li> </ul> </li> <li>Unendliche Reihen</li> <li><a href="http://de.wikipedia.org/wiki/Potenzreihe">Potenzreihe</a></li> <li>Stetigkeit</li> <li><a href="http://de.wikipedia.org/wiki/Gleichm%C3%A4%C3%9Fige_Stetigkeit">Gleichm&auml;&szlig;ige Stetigkeit</a>: Definition, Beispiele</li> <li>H&ouml;here Ableitungen</li> <li><strong>Integrale</strong> <ul> <li>Riemann-Integral</li> <li>Uneigentliche Integrale</li> <li><a href="http://de.wikipedia.org/wiki/Riemann-Stieltjes-Integral">Riemann-Stieltjes-Integral</a></li> <li>Partielle Integration<br/>`$\int_a^b f'(x)\cdot g(x)\,\mathrm{d}x = [f(x)\cdot g(x)]_{a}^{b} - \int_a^b f(x)\cdot g'(x)\,\mathrm{d}x.$`</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Beschr%C3%A4nkte_Variation">Funktionen beschr&auml;nkter Variation</a> <ul> <li>Totalvariation</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Zwischenwertsatz">Zwischenwertsatz</a></li> <li><a href="http://de.wikipedia.org/wiki/Mittelwertsatz_der_Differentialrechnung">Mittelwertsatz</a></li> </ul> <h4>Aufgabenstellungen</h4> <ul> <li>Wahr/Falsch-Ankreuzaufgabe</li> <li>Grenzwert von Folgen bestimmen</li> <li>Konvergenzradius von Potenzreihen bestimmen</li> <li>Zeige, dass eine Funktion stetig ist. Ansatz: <br> `$f \text{ ist stetig} :\Leftrightarrow \forall \varepsilon > 0 \ \exists \delta \ \forall x, z \text{ mit } |x - z| < \delta: |f(x)- f(z)| < \varepsilon$`</li> <li>Zeige, dass eine Funktion differenzierbar ist. Ansatz: h-Methode<br/> `$\displaystyle \lim_{h \rightarrow 0} \frac{f(x_0+h)-f(x_0)}{h}$`</li> <li>Funktionenfolgen auf punktweise und gleichm&auml;&szlig;ige Konvergenz untersuchen</li> <li>Allgemeine Eigenschaften der e-Funktion und der Winkelfunktionen</li> <li>Wert von Integralen bestimmen</li> </ul> <h3>Analysis II</h3> <h4>Themen und Schlagworte</h4> <ul> <li>Quadratische Formen</li> <li>Umkehrsatz</li> <li>Implizit definierte Funktionen</li> <li>Wege <ul> <li>Wegl&auml;nge: `$L(\gamma) = \int \| \gamma'(t) \| dt$`</li> <li>Wegintegral: `$\int_\gamma f(x, y, z) d(x,y,z) = \int f(\gamma(t)) \cdot \gamma'(t) dt$`</li> </ul> </li> <li>Fixpunkte, Fixpunktsatz von Banach</li> <li><a href="http://de.wikipedia.org/wiki/Jacobi-Matrix">Jacobi-Matrix</a></li> <li>Extremwerte <ul> <li>... unter Nebenbedingungen</li> <li>Hessematrix</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Banachscher_Fixpunktsatz">Banachscher Fixpunktsatz</a></li> <li>Differentialgleichungen <ul> <li>Systeme linearer Differentialgleichungen</li> <li>Anfangswertprobleme</li> <li><a href="http://de.wikipedia.org/wiki/Fundamentalsystem_(Mathematik)">Fundamentalsystem</a></li> <li>Variation der Konstanten</li> <li><a href="http://de.wikipedia.org/wiki/Satz_von_Picard-Lindel%C3%B6f">Satz von Picard-Lindel&ouml;f</a></li> </ul> </li> </ul> <h4>Aufgabenstellungen</h4> <ul> <li>Sind gegebene Mengen offen, abgeschlossen bzw. vollst&auml;ndig?</li> <li>Rand einer Menge besttimmen</li> <li>Lokale und globale Extrema einer Funktion `$f$` bestimmen. Ansatz:<br/> Gradient `$\nabla f$` bestimmen und gleich null setzen. Die Funktionswerte, die das erf&uuml;llen, sind die kritischen Punkte. In Hessematrix einsetzen und Definitheit pr&uuml;fen.</li> <li>L&ouml;sung von nichtlinearen Gleichungssystem</li> <li>Differenzierbarkeit zeigen &rarr; `$\displaystyle \lim_{h \rightarrow 0} \frac{f(x_0+h)-f(x_0)- A \cdot h}{\|h\|}$`</li> <li>L&ouml;sung eines Anfangswertproblems bestimmen</li> <li>&bdquo;Beweisen Sie Existenz und Eindeutigkeit einer L&ouml;sung&ldquo; &rarr; Picard-Lindel&ouml;f</li> <li>Zeigen Sie die rektifizierbarkeit eines Weges `$\gamma$`:<br/> &rarr; Differenzierbarkeit zeigen, ableiten, stetigkeit der Ableitung zeigen.</li> </ul> <h2>Lernplan</h2> <p>Man sollte die &Uuml;bungsbl&auml;tter nochmals machen, die relevanten Kapitel im <a href="http://mitschriebwiki.nomeata.de/Ana1.pdf">Skript f&uuml;r Analysis I</a> und im Skript f&uuml;r <a href="http://mitschriebwiki.nomeata.de/SS10/Ana2Bachelor.pdf">Analysis II (Bachelor)</a> durchlesen und Klausuren rechnen. (Aktuellere Skripte finden sich in meinem <a href="https://github.com/MartinThoma/LaTeX-examples/tree/master/documents">GitHub Repository</a>. Allerdings muss man die PDF selbst erstellen.)</p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Dienstag, den 25. September 2012 von 08:00 bis 13:00 Uhr <strong>Ort</strong>: <a href="http://www.math.kit.edu/iana3/~schmoeger/seite/einteilung/de">H&ouml;rsaaleinteilung</a> - Ich bin im <a href="https://maps.google.com/maps?q=49.009522,8.412978&ll=49.009522,8.412979&spn=0.000932,0.002642&num=1&t=m&z=19">Hetz-H&ouml;rsaal</a>. <strong>Dauer</strong>: 2 h Analysis I, 1 h Pause, 2 h Analysis II <strong>Punkte</strong>: 7 Aufgaben &agrave; 3 Punkte f&uuml;r Analysis I, 7 Aufgaben &agrave; 3 Punkte f&uuml;r Analysis II <strong>Bestehensgrenze</strong>: Wohl bei ca. 21 Punkten <strong>&Uuml;bungsschein</strong>: Ist im Studierendenportal eingetragen <strong>Bonuspunkte</strong>: Gibt es nicht.</p> <h2>Ergebnisse</h2> <p>Die Klausureinsicht ist am 24.10.2012 von 14:00 - 16:30 Uhr (<a href="http://www.math.kit.edu/iana3/lehre/ana22012s/event/einsicht/">Quelle</a>).</p> Mathe-Aufgabe: Blutspende http://martin-thoma.com/mathe-aufgabe-blutspende Tue, 14 Aug 2012 15:00:16 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/mathe-aufgabe-blutspende <h2>Aufgabenstellung</h2> <p>Ein Mensch hat ca. 5 Liter Blut. Bei einer Blutspende wird in der Regel etwa ein halber Liter Blut entnommen. Bis zur n&auml;chsten Blutspende ist wird dieses Blut wieder neu gebildet. </p> <p>Wie h&auml;ufig muss Blut gespendet werden, bis 95% des urspr&uuml;nglichen Blutes gespendet wurde?</p> <p>Die nat&uuml;rliche Neubildung von Blut auch ohne Blutspende wird vernachl&auml;ssigt.</p> <h2>Berechnung</h2> <h3>Die ersten Werte</h3> <p><code>$f: \mathbb{N}_0 \rightarrow \mathbb{R}_0^+$</code> sei die Menge des urspr&uuml;nglichen Blutes in Liter, das nach <code>$x$</code> Spenden gespendet wurde:</p> <p><code>$f(0) = 0$</code></p> <p>Beim ersten mal Blutspenden wird ein halber Liter des urspr&uuml;nglichen Blutes gespendet:</p> <p><code>$f(1) = 0{,}5 + f(0)$</code></p> <p>Beim zweiten mal Blutspenden werden 0,45 Liter des urspr&uuml;nglichen Blutes gespendet:</p> <p><code>$f(2) = \frac{5-0{,}5}{5} \cdot 0{,}5 \text{ Liter} + f(1) + f(0) = 0{,}95 \text{ Liter}$</code></p> <p>Beim dritten mal Blutspenden werden 0,405 Liter des urspr&uuml;nglichen Blutes gespendet:</p> <p><code>$f(3) = \frac{5-0{,}95}{5} \cdot 0{,}5 \text{ Liter} + f(2) + f(1) + f(0) = 1{,}355 \text{ Liter}$</code></p> <h3>Eine rekursive Formel</h3> <p><code>$ \begin{align} f(1) &amp;= 0{,}5 \\ f(x) &amp;= \overbrace{\underbrace{\frac{5-f(x-1)}{5}}_{\text{Anteil}} \cdot 0{,}5}^{\text{neue Blutmenge}} + f(x-1) \\ &amp;= 0{,}5 - \frac{1}{10} \cdot f(x-1) + f(x-1) \\ &amp;= 0{,}5 + \frac{9}{10} \cdot f(x-1) \end{align} $</code></p> <p>Dabei gilt: <ul> <li>0,5 ist die gespendete Blutmenge in Liter einer Spende</li> <li><code>$\frac{9}{10} = \frac{\text{gespendete Blutmenge}}{\text{gesamte Blutmenge}}$</code></li> </ul></p> <h3>Aufl&ouml;sen der Rekursion</h3> <p><code>$ \begin{align} f(4) &amp;= 0{,}5 + \frac{9}{10} \cdot (0{,}5 + \frac{9}{10} \cdot (0{,}5 + \frac{9}{10} \cdot 0{,}5))\\ &amp;= 0{,}5 + \frac{9}{10} \cdot 0{,}5 + (\frac{9}{10})^2 \cdot (0{,}5 + \frac{9}{10} \cdot 0{,}5)\\ &amp;= 0{,}5 + \frac{9}{10} \cdot 0{,}5 + (\frac{9}{10})^2 \cdot 0{,}5 + (\frac{9}{10})^3 \cdot 0{,}5\\ &amp;= 0{,}5 \cdot (1 + \frac{9}{10} + (\frac{9}{10})^2 + (\frac{9}{10})^3)\\ f(x)&amp;= \frac{1}{2} \cdot \sum_{i=0}^{x} (\frac{9}{10})^i \end{align} $</code></p> <h3>Aufl&ouml;sen des Summensymbols</h3> <p><code>$ \begin{align} f(x) &amp;= \frac{1}{2} \cdot \sum_{i=0}^{x} (\frac{9}{10})^i\\ &amp;= \frac{1}{2}\cdot (\frac{0{,}9^{x+1} - 1}{0{,}9 - 1})\\ &amp;= \frac{1}{2}\cdot (-10 \cdot 0{,}9^{x+1} + 10)\\ &amp;= -5 \cdot 0{,}9^{x+1} + 5\\ &amp;= 5 \cdot (1 - 0{,}9^{x+1}) \end{align} $</code></p> <h2>L&ouml;sung</h2> <p><code>$ \begin{align} 0{,}95 \cdot 5 &amp;= 5 \cdot (1- 0{,}9^{x+1})\\ 0{,}95 &amp;= 1 - 0{,}9^{x+1}\\ 0{,}9^{x+1} &amp;= 0{,}05\\ \ln(0{,}9) \cdot {x+1} &amp;= \ln(0{,}05) \\ x &amp;= \frac{\ln(0,05)}{\ln(0{,}9)} - 1\\ x &amp;= 27{,}43 \end{align} $</code></p> <h2>Antwort</h2> <p>Nach dem 28. mal Blutspenden wurden 95% des urspr&uuml;nglichen Blutes gespendet.</p> Project Euler: Problem 26 http://martin-thoma.com/project-euler-problem-26 Mon, 13 Aug 2012 15:00:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/project-euler-problem-26 <p>The task in <a href="http://projecteuler.net/problem=26">Problem 26</a> of Project Euler is:</p> <blockquote>Find the value of d < 1000 for which `$\frac{1}{d}$` contains the longest recurring cycle in its decimal fraction part.</blockquote> <h2>How to solve</h2> <p>Think about how you divide with pen and paper. How do you recognize that you have a cycle?</p> <p>You look at the rest. If you&#39;ve seen the rest before, you are just about to get into the cycle.</p> <h2>My solution</h2> <p>This brute force solution finds the solution instantly.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">unittest</span> <span class="k">def</span> <span class="nf">getCycle</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">):</span> <span class="k">assert</span> <span class="n">p</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">assert</span> <span class="n">q</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">p</span> <span class="o">&gt;=</span> <span class="n">q</span><span class="p">:</span> <span class="n">p</span> <span class="o">-=</span> <span class="n">q</span> <span class="k">if</span> <span class="n">p</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># p/q is an integer</span> <span class="k">return</span> <span class="s">&quot;&quot;</span> <span class="n">digits</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># map rest to digit number</span> <span class="c"># for 0.1234567, 1 is the digit #0, 2 digit #1, ...</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">cycle</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">p</span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="n">digits</span><span class="p">[</span><span class="n">rest</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span> <span class="n">rest</span> <span class="o">*=</span> <span class="mi">10</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">rest</span> <span class="o">/</span> <span class="n">q</span> <span class="n">rest</span> <span class="o">-=</span> <span class="n">tmp</span><span class="o">*</span><span class="n">q</span> <span class="n">cycle</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> <span class="k">if</span> <span class="n">rest</span> <span class="ow">in</span> <span class="n">digits</span><span class="p">:</span> <span class="k">return</span> <span class="n">cycle</span><span class="p">[</span><span class="n">digits</span><span class="p">[</span><span class="n">rest</span><span class="p">]:]</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">euler26</span><span class="p">(</span><span class="n">maximum</span><span class="o">=</span><span class="mi">1000</span><span class="p">):</span> <span class="n">maxCycleLength</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">maximum</span> <span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">getCycle</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> <span class="k">if</span> <span class="n">tmp</span> <span class="o">&gt;</span> <span class="n">maxCycleLength</span><span class="p">:</span> <span class="n">maxCycleLength</span> <span class="o">=</span> <span class="n">tmp</span> <span class="n">number</span> <span class="o">=</span> <span class="n">i</span> <span class="k">return</span> <span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="n">maxCycleLength</span><span class="p">)</span> <span class="k">class</span> <span class="nc">TestSequenceFunctions</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">seq</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_simpleSequences</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">getCycle</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="s">&quot;&quot;</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">getCycle</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">6</span><span class="p">),</span> <span class="s">&quot;6&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">9</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">getCycle</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="mi">9</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">getCycle</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">7</span><span class="p">),</span> <span class="s">&quot;142857&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span> <span class="c">#unittest.main()</span> <span class="k">print</span> <span class="n">euler26</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> </code></pre></div> Ist die Funktion / Relation wohldefiniert? http://martin-thoma.com/ist-die-funktion-relation-wohldefiniert Sun, 12 Aug 2012 15:00:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ist-die-funktion-relation-wohldefiniert <p>Ich verstehe unter einer wohldefinierten Funktion / Relation die Unabh&auml;ngigkeit von den Repr&auml;sentanten. Wikipedia sagt dazu:</p> <blockquote>Man kann in der Mathematik ein Objekt nicht nur durch eine Definitionsgleichung (explizit), sondern auch durch eine charakteristische Eigenschaft (implizit) definieren. W&auml;hrend eine explizite Definition immer zul&auml;ssig ist, ist eine implizite Definition nur unter der Bedingung zul&auml;ssig, dass es tats&auml;chlich genau ein Objekt mit der angegebenen Eigenschaft gibt. Diese Bedingung nennt man die Wohldefiniertheit der impliziten Definition.</blockquote> <p>Quelle: <a href="http://de.wikipedia.org/wiki/Wohldefiniertheit">Wohldefiniertheit</a></p> <h2>Beispiel 1</h2> <p>Sei <code>$f:\mathbb{Q} \rightarrow \mathbb{Q}$</code> eine Abbildung und definiert durch:</p> <p><code>$f(\frac{p}{q}) := \frac{p}{q}$</code></p> <p><strong>Frage</strong>: Ist <code>$f$</code> wohldefiniert? <strong>Antwort</strong>: Ja. Es sei <code>$\frac{p&#39;}{q&#39;}$</code> die vollst&auml;ndig gek&uuml;rzte Darstellung von <code>$\frac{p}{q}$</code>. Also gilt: <code>$p = p&#39; \cdot \lambda \land q = q&#39; \cdot \lambda$</code> mit <code>$\lambda \in \mathbb{R} \setminus \{0\}$</code>. <code>$\Rightarrow \frac{p}{q} = \frac{p&#39; \cdot \lambda}{q&#39; \cdot \lambda}$</code>. <code>$\Rightarrow f(\frac{p}{q}) = \frac{p&#39; \cdot \lambda}{q&#39; \cdot \lambda} = \frac{p&#39;}{q&#39;}$</code>. <code>$\Rightarrow f(\frac{p}{q})$</code> ist unabh&auml;ngig vom Repr&auml;sentanten. <code>$\Rightarrow f$</code> ist wohldefiniert <code>$\blacksquare$</code></p> <h2>Beispiel 2</h2> <p>Sei <code>$f:\mathbb{Q} \rightarrow \mathbb{Q}$</code> eine Abbildung und definiert durch:</p> <p><code>$f(\frac{p}{q}) := \frac{p+1}{q}$</code></p> <p><strong>Frage</strong>: Ist <code>$f$</code> wohldefiniert? <strong>Antwort</strong>: Nein. </p> <p><code>$f(\frac{0}{1}) = \frac{0+1}{1} = 1 \neq \frac{1}{2} = \frac{0+1}{2} = f(\frac{0}{2}) \blacksquare$</code></p> <h2>Beispiel 3</h2> <p>Sei <code>$f:\mathbb{Q} \rightarrow \mathbb{Q}$</code> eine Abbildung und definiert durch:</p> <p><code>$f(\frac{p}{q}) := \frac{p-q}{p+q}$</code></p> <p><strong>Frage</strong>: Ist <code>$f$</code> wohldefiniert? <strong>Antwort</strong>: Ja.</p> <p>Es sei <code>$\frac{p&#39;}{q&#39;}$</code> die vollst&auml;ndig gek&uuml;rzte Darstellung von <code>$\frac{p}{q}$</code>. Also gilt: <code>$p = p&#39; \cdot \lambda \land q = q&#39; \cdot \lambda$</code> mit <code>$\lambda \in \mathbb{R} \setminus \{0\}$</code>.</p> <p><code>$\Rightarrow f(\frac{p}{q}) = f(\frac{\lambda \cdot p&#39;}{\lambda \cdot q&#39;}) = \frac{\lambda \cdot p&#39; - \lambda \cdot q&#39;}{\lambda \cdot p&#39; + \lambda \cdot q&#39;} = \frac{\lambda (p&#39; - q&#39;)}{\lambda (p&#39; + q&#39;)} = \frac{p&#39; - q&#39;}{p&#39; + q&#39;} \blacksquare$</code></p> Sichtweite des Burdsch Chalifa http://martin-thoma.com/sichtweite-des-burdsch-chalifa Sun, 12 Aug 2012 11:37:17 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sichtweite-des-burdsch-chalifa <h2>Aufgabenstellung</h2> <p>Der Burdsch Chalifa war 2010 das h&ouml;chste Geb&auml;ude der Erde. Bis zur Spitze sind es 830 m.</p> <p>Angenommen, die Erde w&auml;re eine perfekte Kugel mit einem Radius von 6370 km und die Sicht w&auml;re nicht durch Nebel, Wolken oder sonstige Hindernisse eingeschr&auml;nkt. Aus welcher Entfernung, die man &uuml;ber die Erde direkt zum Burdsch Chalifa zur&uuml;cklegt, k&ouml;nnte man den Burdsch Chalifa maximal sehen?</p> <h3>Situationsskizze</h3> <p><a href="../images/2012/08/earth-skizze.png"><img src="../images/2012/08/earth-skizze.png" alt="" title="Situationsskizze f&uuml;r die Berechnung" width="500" height="553" class="aligncenter size-full wp-image-39311" /></a> Gesucht ist die L&auml;nge des neongr&uuml;n hervorgehobenen Kreisbogens x.</p> <h3>Rechenweg</h3> <p><code>$\begin{align} x &amp;= \text{Umfang} \cdot \frac{\varphi}{360^\circ} \\ &amp;= 2 \cdot r \cdot \pi \cdot \frac{\cos^{-1}(\frac{r}{r+h})}{360^\circ} \\ &amp;= 2 \cdot 6370 \text{km} \cdot \pi \cdot \frac{\cos^{-1}(\frac{6370}{6370,83})}{360^\circ} \\ &amp;= 102,8 \text{km} \end{align}$</code></p> <h3>Antwort</h3> <p>Bei optimalen, also unrealistischen, Bedingungen k&ouml;nnte man die Spitze des Burdsch Chalifa noch in 102,8 km entfernung sehen. Dies entspricht &uuml;brigens auch dem Punkt auf der Erdoberfl&auml;che, der vom Burdsch Chalifa am weitesten entfernt und zu sehen ist. Auch wenn nur die Luftlinie gemessen wird, sind es 102,8 km, da der Erdradius bedeutend gr&ouml;&szlig;er als der Burdsch Chalifa ist.</p> <p>Laut <a href="http://www.bild.de/lifestyle/bams/burj-chalifa/burj-chalifa-bei-dieser-story-wurde-uns-schwindelig-828-meter-11056462.bild.html">Bildzeitung</a> kann man die Spitze des Burdsch Chalifa noch in 95 km sehen.</p> <h2>Erweiterung der Aufgabenstellung</h2> <p>Das Dorf Mileiha liegt direkt &ouml;stlich vom Burdsch Chalifa (25&deg; 11&#39; 50&#39;&#39; N, 55&deg; 16&#39; 27&#39;&#39; O).</p> <p>Wie weit &ouml;stlich darf das Dorf maximal liegen, damit man die Spitze des Burdsch Chalifa bei optimalen Bedingungen noch sehen kann?</p> <p>Hinweis: Es gelten noch immer die gleichen Voraussetzungen wie im ersten Teil der Aufgabe.</p> <h3>Situationsskizze</h3> <p><a href="../images/2012/08/earth-skizze-21.png"><img src="../images/2012/08/earth-skizze-21.png" alt="" title="Skizze der Erde" width="500" height="299" class="aligncenter size-full wp-image-39411" /></a></p> <p>Gesucht ist die gr&uuml;n eingezeichnete Kurve, die sich &uuml;ber die Erdoberfl&auml;che kr&uuml;mmt. Ihre L&auml;nge sei x. Um diese zu berechnen, m&uuml;ssen wir wissen welchen Radius die Kreisfl&auml;che hat, die entsteht, wenn man die Erde am 25. Breitengrad schneidet. Der Radius dieser Kreisfl&auml;che sei <code>$r_{25}$</code>.</p> <h3>Berechnung</h3> <p><code>$ \begin{align} \text{Breitengrad} &amp;= 25 + \frac{11}{60} + \frac{50}{60 \cdot 60} \\ \text{Breitengrad} &amp;= \frac{9071}{360} \approx 25,1972 \\ \cos(\frac{9071}{360}) &amp;= \frac{r_{25,1972}}{6370\text{km}} \\ r_{25,1972} &amp;= \cos(\frac{9071}{360}) \cdot 6370\text{km} \\ r_{25,1972} &amp;\approx 5764\text{km} \end{align} $</code></p> <p>Der soeben errechnete Radius kann einfach in die im ersten Abschnitt erarbeitete Formel eingesetzt werden: <code>$ \begin{align} x &amp;= 2 \cdot r \cdot \pi \cdot \frac{\cos^{-1}(\frac{r}{r+h})}{360^\circ} \\ &amp;= 2 \cdot 5764 \text{km} \cdot \pi \cdot \frac{\cos^{-1}(\frac{5764}{5764,83})}{360^\circ} \\ &amp;\approx 97,8 \text{km} \end{align} $</code></p> <p>Nun sollte man noch ber&uuml;cksichtigen, dass die Beobachter wohl nicht auf der Erde kriechen, sondern ihre Augen in einer H&ouml;he von ca. 1,6m sind:</p> <p><code>$ \begin{align} x &amp;= 2 \cdot 5764 \text{km} \cdot \frac{\pi}{360^\circ} \cdot ( \cos^{-1}(\frac{5764}{5764,83}) + \cos^{-1}(\frac{5764}{5764,0016}) \\ &amp;\approx 102 \text{km} \end{align} $</code></p> <h3>Antwort</h3> <p>Der am weitesten entfernte Punkt, der direkt &ouml;stlich vom Burdsch Chalifa steht und von dem aus die Spitze des Burdsch Chalifa unter optimalen Bedinungen noch erkannt werden kann, liegt ca. 102 km entfernt.</p> <p>Anmerkung: Mileiha liegt ca. 60 km vom Burdsch Chalifa entfernt. Er m&uuml;sste also von Mileiha zu sehen sein.</p> Entwurfsmuster-Beispiele http://martin-thoma.com/entwurfsmuster-beispiele Sat, 11 Aug 2012 15:00:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/entwurfsmuster-beispiele <h2>Singleton</h2> <p><strong>Zweck</strong>: Stelle sicher, dass es nur eine Instanz dieser Klasse gibt. <strong>Beispiel</strong>: <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#getRuntime%28%29">java.lang.Runtime.getRuntime()</a></p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Singleton</span> <span class="o">{</span> <span class="c1">// an instance of a singleton</span> <span class="kd">private</span> <span class="kd">static</span> <span class="n">Singleton</span> <span class="n">instance</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span> <span class="c1">// private default constructor to prevent the external creation</span> <span class="c1">// of more instances</span> <span class="kd">private</span> <span class="nf">Singleton</span><span class="o">()</span> <span class="o">{</span> <span class="o">}</span> <span class="c1">// static method which returns the instance</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kd">synchronized</span> <span class="n">Singleton</span> <span class="nf">getInstance</span><span class="o">()</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">instance</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Singleton</span><span class="o">();</span> <span class="o">}</span> <span class="k">return</span> <span class="n">instance</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Bequemlichkeitsklasse</h2> <p><strong>Zweck</strong>: Faulheit - mache Methodenaufrufe durch &auml;nderbare default-Parameter einfacher. Das Bequemlichkeitsmuster ist einfach das &Uuml;berladen einer Methode:</p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Bequemlichkeitsklasse</span> <span class="o">{</span> <span class="c1">// convenience class</span> <span class="kt">int</span> <span class="n">v1</span><span class="o">,</span> <span class="n">v2</span><span class="o">,</span> <span class="n">v3</span><span class="o">;</span> <span class="kt">int</span> <span class="nf">anfrage</span><span class="o">(</span><span class="kt">int</span> <span class="n">p1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p2</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p3</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">p1</span> <span class="o">*</span> <span class="n">p2</span> <span class="o">*</span> <span class="n">p3</span><span class="o">;</span> <span class="o">}</span> <span class="kt">int</span> <span class="nf">anfrage</span><span class="o">(</span><span class="kt">int</span> <span class="n">p1</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">anfrage</span><span class="o">(</span><span class="n">p1</span><span class="o">,</span> <span class="n">v2</span><span class="o">,</span> <span class="n">v3</span><span class="o">);</span> <span class="o">}</span> <span class="kt">int</span> <span class="nf">anfrage</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">anfrage</span><span class="o">(</span><span class="n">v1</span><span class="o">,</span> <span class="n">v2</span><span class="o">,</span> <span class="n">v3</span><span class="o">);</span> <span class="o">}</span> <span class="kt">void</span> <span class="nf">setzeZustand</span><span class="o">(</span><span class="kt">int</span> <span class="n">p1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p2</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p3</span><span class="o">)</span> <span class="o">{</span> <span class="n">v1</span> <span class="o">=</span> <span class="n">p1</span><span class="o">;</span> <span class="n">v2</span> <span class="o">=</span> <span class="n">p2</span><span class="o">;</span> <span class="n">v3</span> <span class="o">=</span> <span class="n">p3</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Schablonenmethode</h2> <p>Siehe <a href="../java-puzzle-9-template-method-pattern/">Java Puzzle #9: Template method pattern</a>.</p> <h2>Siehe auch</h2> <ul> <li><a href="http://stackoverflow.com/a/2707195/562769">Examples of GoF Design Patterns in Java</a></li> </ul> Java Puzzle #9: Template method pattern http://martin-thoma.com/java-puzzle-9-template-method-pattern Fri, 10 Aug 2012 15:00:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-9-template-method-pattern <p>The following Java Puzzle is an example for the <a href="http://en.wikipedia.org/wiki/Template_method_pattern">template method pattern</a>. It is a design pattern by the <a href="http://en.wikipedia.org/wiki/Design_Patterns">Gang of Four</a>.</p> <p>What is the output of the following snippet: <strong>AbstractClass.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">AbstractClass</span> <span class="o">{</span> <span class="kt">int</span> <span class="nf">templateMethod</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="nf">simpleOperation1</span><span class="o">()</span> <span class="o">*</span> <span class="n">simpleOperation2</span><span class="o">();</span> <span class="o">}</span> <span class="kt">int</span> <span class="nf">simpleOperation1</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">2</span><span class="o">;</span> <span class="o">}</span> <span class="kt">int</span> <span class="nf">simpleOperation2</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">3</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>ConcreteClass.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ConcreteClass</span> <span class="kd">extends</span> <span class="n">AbstractClass</span> <span class="o">{</span> <span class="nd">@Override</span> <span class="kt">int</span> <span class="nf">simpleOperation1</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">5</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kt">int</span> <span class="nf">simpleOperation2</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="mi">7</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>test.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">ConcreteClass</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConcreteClass</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">templateMethod</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="bash">35 </code></pre></div> <p>35</p> <h2>Explanation</h2> <p>You can think of it like this: First, you create the empty class <code>ConcreteClass</code>. It has only the methods inherited by <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html">Object</a> like the <code>constructor</code>, <code>equals()</code> and <code>toString()</code>. Then it gets extended by AbstractClass with <code>templateMethod()</code>, <code>simpleOperation1()</code> and <code>simpleOperation2()</code>. After that, the method overrides <code>simpleOperation1()</code> and <code>simpleOperation2()</code>, but <code>templateMethod()</code> uses them. It uses the methods that are now in <code>ConcreteClass</code>.</p> <p>I don&#39;t know what Java exactly does internally, but thats a good way to think about it. If somebody has more information, please share it as a comment!</p> Java Puzzle #8: Interfaces and Visibility http://martin-thoma.com/java-puzzle-8-interfaces-and-visibility Thu, 09 Aug 2012 15:00:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-8-interfaces-and-visibility <p>What is the output of the following snippets:</p> <p><strong>Shape.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Shape</span> <span class="o">{</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">draw</span><span class="o">();</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">calculateArea</span><span class="o">();</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">printArea</span><span class="o">();</span> <span class="o">}</span> </code></pre></div> <p><strong>Rectangle.java</strong></p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Rectangle</span> <span class="kd">implements</span> <span class="n">Shape</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">x1</span><span class="o">,</span> <span class="n">x2</span><span class="o">,</span> <span class="n">y1</span><span class="o">,</span> <span class="n">y2</span><span class="o">;</span> <span class="kd">private</span> <span class="kt">int</span> <span class="n">area</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">Rectangle</span><span class="o">(</span><span class="kt">int</span> <span class="n">x1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">x2</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y2</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">x1</span> <span class="o">=</span> <span class="n">x1</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">x2</span> <span class="o">=</span> <span class="n">x2</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">y1</span> <span class="o">=</span> <span class="n">y1</span><span class="o">;</span> <span class="k">this</span><span class="o">.</span><span class="na">y2</span> <span class="o">=</span> <span class="n">y2</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">calculateArea</span><span class="o">()</span> <span class="o">{</span> <span class="n">area</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">((</span><span class="n">x1</span> <span class="o">-</span> <span class="n">x2</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="n">y1</span> <span class="o">-</span> <span class="n">y2</span><span class="o">));</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">draw</span><span class="o">()</span> <span class="o">{</span> <span class="c1">// TODO Auto-generated method stub</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">printArea</span><span class="o">()</span> <span class="o">{</span> <span class="n">calculateArea</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;My area is &quot;</span> <span class="o">+</span> <span class="n">area</span> <span class="o">+</span> <span class="s">&quot;.&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>test.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Shape</span> <span class="n">s</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Rectangle</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span> <span class="n">s</span><span class="o">.</span><span class="na">printArea</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="bash">My area is 1. </code></pre></div> <h2>Explanation</h2> <p>Interfaces may not implement anything. So it makes no sense to define private methods. Nevertheless it seems to be valid Java code.</p> Short Educational Clips http://martin-thoma.com/short-educational-clips Wed, 08 Aug 2012 15:00:37 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/short-educational-clips <p>Here are some clips which are interesting for education. For example, one of then explains the history of the English language in about 10 minutes.</p> <h2>60-Second Adventures in Thought</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/5zVaFjSxAZs" frameborder="0" allowfullscreen></iframe> <h2>United Kingdom, Great Britain and England</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/rNu8XDBSn10" frameborder="0" allowfullscreen></iframe> <h2>History of English</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/H3r9bOkYW9s" frameborder="0" allowfullscreen></iframe> <h2>Electric Vocabulary</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/MBRTR2dlwvA" frameborder="0" allowfullscreen></iframe> <h2>DNA Song</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/FUA6_Ucw3i4" frameborder="0" allowfullscreen></iframe> <h2>Wakko's 50 State Capitols</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/MSvJ9SN8THE" frameborder="0" allowfullscreen></iframe> <h2>Yakko's World</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/x88Z5txBc7w" frameborder="0" allowfullscreen></iframe> <h2>The Monty Hall Problem</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/mhlc7peGlGg" frameborder="0" allowfullscreen></iframe> <h2>See also</h2> <ul> <li><a href="http://www.youtube.com/user/TEDEducation/videos">TEDEducation</a></li> </ul> Endliche Gruppen http://martin-thoma.com/endliche-gruppen Wed, 08 Aug 2012 10:03:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/endliche-gruppen <p>Endliche Gruppen haben ein paar interessante Eigenschaften. Unter anderem gibt es nur zwei Gruppen mit vier Elementen. alle anderen Gruppen sind isomorph zu diesen Gruppen. Das zeige ich im folgendem.</p> <h2>Gruppen mit vier Elementen</h2> <p>Es gibt genau zwei Gruppen mit vier Elementen. Das sind: <code>$G_1 = (\mathbb{Z}/4\mathbb{Z}, +)$</code> und <code>$G_2 = (\mathbb{Z}/2\mathbb{Z} \times \mathbb{Z}/2\mathbb{Z}, +)$</code></p> <h3>Beweis Teil 1: G<sub>1</sub> und G<sub>2</sub> sind Gruppen</h3> <p>Eine Gruppe <code>$(A, \circ)$</code> m&uuml;ssen drei Eigenschaften erf&uuml;llen: <ul> <li>(G1) <strong>Assoziativit&auml;t</strong>: <code>$\forall a,b,c \in A: (a \circ b) \circ c = a \circ (b \circ c)$</code></li> <li>(G2) <strong>Neutrales Element</strong>: <code>$\exists e \in A \forall a \in A: e \circ a = a \circ e = a$</code></li> <li>(G3) <strong>Inverses Element</strong>: <code>$\forall a \in A \exists a^{-1} \in A: a \circ a^{-1} = a^{-1} \circ a = e$</code></li> </ul></p> <p>Die Verkn&uuml;pfungstafel f&uuml;r <code>$G_1$</code> lautet: <table class="wikitable" style="width:300px"> <tr> <th>+</th> <th>0</th> <th>1</th> <th>2</th> <th>3</th> </tr> <tr> <th>0</th> <td class="hintergrundfarbe9">0</td> <td>1</td> <td>2</td> <td>3</td> </tr> <tr> <th>1</th> <td>1</td> <td>2</td> <td>3</td> <td class="hintergrundfarbe9">0</td> </tr> <tr> <th>2</th> <td>2</td> <td>3</td> <td class="hintergrundfarbe9">0</td> <td>1</td> </tr> <tr> <th>3</th> <td>3</td> <td class="hintergrundfarbe9">0</td> <td>1</td> <td>2</td> </tr> </table></p> <p>Man sieht direkt an der Tabelle, dass <strong>0</strong> das neutrale Element ist und jedes Element ein Inverses hat. F&uuml;r die Assoziativit&auml;t f&auml;llt mir nichts besseres ein, als die 64 M&ouml;glichkeiten alle auszuprobieren. Geht das k&uuml;rzer?</p> <p>Die Verkn&uuml;pfungstafel f&uuml;r <code>$G_2$</code> lautet: <table class="wikitable" style="width:300px"> <tr> <th>+</th> <th>(0,0)</th> <th>(0,1)</th> <th>(1,0)</th> <th>(1,1)</th> </tr> <tr> <th>(0,0)</th> <td class="hintergrundfarbe9">(0,0)</td> <td>(0,1)</td> <td>(1,0)</td> <td>(1,1)</td> </tr> <tr> <th>(0,1)</th> <td>(0,1)</td> <td class="hintergrundfarbe9">(0,0)</td> <td>(1,1)</td> <td>(1,0)</td> </tr> <tr> <th>(1,0)</th> <td>(1,0)</td> <td>(1,1)</td> <td class="hintergrundfarbe9">(0,0)</td> <td>(0,1)</td> </tr> <tr> <th>(1,1)</th> <td>(1,1)</td> <td>(1,0)</td> <td>(0,1)</td> <td class="hintergrundfarbe9">(0,0)</td> </tr> </table></p> <p>Das neutrale Element ist hier also <strong>(0,0)</strong>.</p> <h3>Beweis Teil 2: Es gibt keine weiteren Gruppen</h3> <p>Hierf&uuml;r ist es sehr hilfreich zu wissen, dass die Verkn&uuml;pfungstafel einer Gruppe immer alle Elemente sowohl in jeder Spalte, als auch in jeder Zeile hat. Dann kann man es Sudoku-m&auml;&szlig;ig beweisen.</p> <p>Folgendes Skelett gilt immer: <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td></td> <td></td> <td></td> </tr> <tr> <th>b</th> <td>b</td> <td></td> <td></td> <td></td> </tr> <tr> <th>c</th> <td>c</td> <td></td> <td></td> <td></td> </tr> </table></p> <h4>#1: e auf (1,1)</h4> <p>Wir haben nun folgende Tabelle: <table> <tr> <td> <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td class="hintergrundfarbe7">e</td> <td class="hintergrundfarbe8">c</td> <td class="hintergrundfarbe8">b</td> </tr> <tr> <th>b</th> <td>b</td> <td class="hintergrundfarbe8">c</td> <td></td> <td></td> </tr> <tr> <th>c</th> <td>c</td> <td class="hintergrundfarbe8">b</td> <td></td> <td></td> </tr> </table> </td> <td> <ul> <li><code>$b + a = c$</code> (da a und e in dieser Spalte sind und b in der Zeile ist)</li> <li><code>$c + a = b$</code> (nur b fehlt in der Spalte)</li> <li><code>$a + b = c$</code> (da a und e in dieser Zeile und b in der Spalte bereits vorkommt)</li> <li><code>$a + c = b$</code> (nur b fehlt in der Zeile)</li> </ul> </td> </tr> </table></p> <h4>#1.1: e auf (2,2)</h4> <table> <tr> <td> <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td>e</td> <td>c</td> <td>b</td> </tr> <tr> <th>b</th> <td>b</td> <td>c</td> <td class="hintergrundfarbe7">e</td> <td class="hintergrundfarbe8">a</td> </tr> <tr> <th>c</th> <td>c</td> <td>b</td> <td class="hintergrundfarbe8">a</td> <td class="hintergrundfarbe8">e</td> </tr> </table> <p></td> <td> <ul> <li><code>$c + c = e$</code> (genau 1 e pro Zeile / Spalte)</li> <li><code>$b + c = a$</code> (nur a fehlt in der Zeile)</li> <li><code>$c + b = a$</code> (nur a fehlt in der Zeile)</li> </ul> </td> </tr> </table></p> <p>Diese L&ouml;sung enstpricht <code>$G_2$</code>.</p> <h4>#1.2: a auf (2, 2)</h4> <table> <tr> <td> <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td>e</td> <td>c</td> <td>b</td> </tr> <tr> <th>b</th> <td>b</td> <td>c</td> <td class="hintergrundfarbe7">a</td> <td class="hintergrundfarbe8">e</td> </tr> <tr> <th>c</th> <td>c</td> <td>b</td> <td class="hintergrundfarbe8">e</td> <td class="hintergrundfarbe8">a</td> </tr> </table> <p></td> <td> <ul> <li><code>$b + c = e$</code> (genau 1 e pro Zeile / Spalte)</li> <li><code>$c + b = e$</code> (genau 1 e pro Zeile / Spalte)</li> <li><code>$c + c = a$</code> (nur a fehlt in der Zeile)</li> </ul> </td> </tr> </table></p> <p>Das entspricht <code>$G_1$</code>. Das sieht man, wenn man ... <ol> <li>... die Spalte a und b tauscht</li> <li>... die Zeilen a und b tauscht</li> <li>... die Elemente a und b tauscht</li> </ol> </p> <h4>#2: b auf (1, 1)</h4> <table> <tr> <td> <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td class="hintergrundfarbe7">b</td> <td class="hintergrundfarbe8">c</td> <td class="hintergrundfarbe8">e</td> </tr> <tr> <th>b</th> <td>b</td> <td class="hintergrundfarbe8">c</td> <td class="hintergrundfarbe8">e</td> <td class="hintergrundfarbe8">a</td> </tr> <tr> <th>c</th> <td>c</td> <td class="hintergrundfarbe8">e</td> <td class="hintergrundfarbe8">a</td> <td class="hintergrundfarbe8">b</td> </tr> </table> <p></td> <td> <ul> <li><code>$b + a = c$</code> (da <code>$c + a \neq c$</code> und c noch nicht in der Spalte ist, aber dennoch vorkommen muss)</li> <li><code>$c+a =e$</code> (genau 1 e pro Zeile / Spalte)</li> <li><code>$c+b = a$</code> (da c und e in der Zeile bereits vorkommen und b in der Spalte ist)</li> <li><code>$c+c = b$</code> (da der Rest schon in der Zeile ist)</li> <li><code>$b+b = e$</code> (da a und b in der Spalte sind, c in der Zeile)</li> <li><code>$b+c = a$</code> (da der Rest in der Zeile schon vorkommt)</li> <li><code>$a+b = c$</code> ( - &quot; - )</li> <li><code>$a+c = e$</code></li> </ul> </td> </tr> </table></p> <p>Das enspricht wieder <code>$G_1$</code>.</p> <h4>#3: c auf (1, 1)</h4> <table> <tr> <td> <table class="wikitable" style="width:250px"> <tr> <th>+</th> <th>e</th> <th>a</th> <th>b</th> <th>c</th> </tr> <tr> <th>e</th> <td>e</td> <td>a</td> <td>b</td> <td>c</td> </tr> <tr> <th>a</th> <td>a</td> <td class="hintergrundfarbe7">c</td> <td class="hintergrundfarbe8">e</td> <td class="hintergrundfarbe8">b</td> </tr> <tr> <th>b</th> <td>b</td> <td class="hintergrundfarbe8">e</td> <td class="hintergrundfarbe8">c</td> <td class="hintergrundfarbe8">a</td> </tr> <tr> <th>c</th> <td>c</td> <td class="hintergrundfarbe8">b</td> <td class="hintergrundfarbe8">a</td> <td class="hintergrundfarbe8">e</td> </tr> </table> <p></td> <td> <ul> <li><code>$a+b = e$</code> (a, c bereits in Zeile, b in Spalte)</li> <li><code>$a+c = b$</code> (a, c, e in Zeile)</li> <li><code>$b+a = e$</code> (a, c in Spalte, b in Zeile)</li> <li><code>$c+c = e$</code> (letztes e)</li> <li><code>$b+c = a$</code> (b, c, e in Spalte)</li> <li><code>$b+b = c$</code> (b, e, a in Zeile)</li> <li><code>$c+a = b$</code> (a, c, e in Spalte)</li> <li><code>$c+b = a$</code> (b, e, c in Spalte)</li> </ul> </td> </tr> </table></p> <p>Das entspricht <code>$G_1$</code>. Das sieht man, wenn man ... <ol> <li>... die Spalte b und c tauscht</li> <li>... die Zeilen b und c tauscht</li> <li>... die Elemente b und c tauscht</li> </ol> </p> Permutationen und Transpositionen http://martin-thoma.com/permutationen-und-transpositionen Wed, 08 Aug 2012 08:36:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/permutationen-und-transpositionen <h2>Permutation</h2> <h3>Definition</h3> <div class="definition">Es sei M eine endliche Menge. Eine bijektive Selbstabbildung von M hei&szlig;t <strong>Permutation</strong>. Die Menge `$S_M$` der Permutationen von M ist eine Gruppe bez&uuml;glich der Verkettung `$\circ$` von Abbildungen und hei&szlig;t symmetrische Gruppe von M.</div> <p>Quelle: <a href="https://studium.kit.edu/sites/vab/0x40F0348A9ACDCE49A96EEE39EB076112/Vorlesungsunterlagen/LA.pdf">Skript</a> von Herrn Prof. Dr. Leuzinger, KIT</p> <h3>Allgemeines</h3> <p>Es ist nun egal, ob ich die Permutationen von {1, 2, 3} oder {42, 1337, ABC} anschaue. Es sind einfach nur drei Objekte, die unterscheidbar sind. Um es einfacher zu machen, gehen wir nun von den Objekten {1, 2, ..., m} aus. Alle Permutationen dieser Objekte bilden eine Gruppe. Diese nennen wir <code>$S_m$</code>.</p> <p>Ein einzelnes Element aus <code>$S_m$</code> wird meist <code>$\pi$</code> oder <code>$\sigma$</code> genannt, also <code>$\pi \in S_m$</code>. Da <code>$\pi$</code> eine Permutation ist, ist es insbesondere eine bijektive Selbstabbildung, also:</p> <p><code>$M = {1, ..., m}$</code> <code>$\pi: M \rightarrow M$</code> <code>$i \mapsto \pi(i)$</code></p> <p>Kurz schreibt man auch: <code>$\pi = \begin{pmatrix} 1 &amp; 2 &amp; 3 &amp; ... &amp; m\\ \pi(1) &amp; \pi(2) &amp; \pi(3) &amp; ... &amp; \pi(m) \end{pmatrix}$</code></p> <h3>Anzahl der Permutationen</h3> <p>Wenn ich n Elemente habe, die ich auf n Pl&auml;tze verteilen muss: Wie viele unterschiedliche Zuordnungen von Elementen zu den Pl&auml;tzen gibt es?</p> <p>Die Antwort ist <code>$n! = 1 \cdot 2 \cdot ... (n - 1) \cdot n = \prod_{i=1}^n i$</code>. F&uuml;r das erste Element sind <code>$n$</code> Pl&auml;tze frei. Das Zweite kann nur noch auf <code>$(n-1)$</code> Pl&auml;tze verteilt werden, ... , das letzte hat nur noch einen Platz zur &quot;Auswahl&quot;.</p> <h3>Erzeugung der Permutationen</h3> <p>Angenommen, man muss in einem Test <code>$S_3$</code> explizit angeben. Wie geht das? </p> <p>Nun, zu erst erzeugt man alle Permutationen. Daf&uuml;r rechnet man sich die Anzahl aus. Es gibt 3 Elemente, also <code>$3 \cdot 2 \cdot 1 = 6$</code> Permutationen: 1. _ _ _ 2. _ _ _ 3. _ _ _ 4. _ _ _ 5. _ _ _ 6. _ _ _</p> <p>Nun zuerst zum ersten Element, der 1. Diese kann ich an die erste, die zweite oder die dritte Stelle verschieben. Also: 1. 1 _ _ 2. 1 _ _ 3. _ 1 _ 4. _ 1 _ 5. _ _ 1 6. _ _ 1</p> <table> <tr> <td>Nun zum zweiten Element, der 2. Wieder das gleiche Prinzip:</td> <td>Und nun nur noch das letzte Einf&uuml;llen:</td> </tr> <tr> <td>1. 1 2 _ 2. 1 _ 2 3. 2 1 _ 4. _ 1 2 5. 2 _ 1 6. _ 2 1</td> <td>1. 1 2 3 2. 1 3 2 3. 2 1 3 4. 3 1 2 5. 2 3 1 6. 3 2 1</td> </tr> </table> <p>Und nun noch als Menge in der mathematischen Schreibweise aufschreiben:</p> <p><code>$S_3 = \left \{ \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 1 &amp; 2 &amp; 3 \end{pmatrix}}_{\pi_1}, \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 1 &amp; 3 &amp; 2 \end{pmatrix}}_{\pi_2}, \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 2 &amp; 1 &amp; 3 \end{pmatrix}}_{\pi_3}, \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 3 &amp; 1 &amp; 2 \end{pmatrix}}_{\pi_4}, \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 2 &amp; 3 &amp; 1 \end{pmatrix}}_{\pi_5}, \underbrace{\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 3 &amp; 2 &amp; 1 \end{pmatrix}}_{\pi_6} \right \}$</code></p> <h3>Verkettung</h3> <p>Was passiert, wenn ich die Permuation <code>$\pi_2$</code> mit der Permutation <code>$\pi_3$</code> verkette? Also: <code>$\pi_x(i) = \pi_2(\pi_3(i)) = \begin{pmatrix}1 &amp; 2 &amp; 3\\ 3 &amp; 1 &amp; 2 \end{pmatrix} = \pi_6$</code> Aber: <code>$\pi_y(i) = \pi_3(\pi_2(i)) = \begin{pmatrix}1 &amp; 2 &amp; 3\\ 2 &amp; 3 &amp; 1 \end{pmatrix} = \pi_5 \neq \pi_6$</code></p> <p>Die Verkettung von Permutationen ist also nicht kommutativ!</p> <p>Es ergibt sich insgesamt folgende Verkn&uuml;fungstabelle (gelesen wird: Zeile zuerst, Spalte sp&auml;ter): <table> <tr> <th style="border-right: 1px solid #000;border-bottom: 1px solid #000;">&nbsp;</th> <th style="border-bottom: 1px solid #000;"><code>$\pi_1$</code></th> <th style="border-bottom: 1px solid #000;"><code>$\pi_2$</code></th> <th style="border-bottom: 1px solid #000;"><code>$\pi_3$</code></th> <th style="border-bottom: 1px solid #000;"><code>$\pi_4$</code></th> <th style="border-bottom: 1px solid #000;"><code>$\pi_5$</code></th> <th style="border-bottom: 1px solid #000;"><code>$\pi_6$</code></th> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_1$</code></th> <td><code>$\pi_1$</code></td> <td><code>$\pi_2$</code></td> <td><code>$\pi_3$</code></td> <td><code>$\pi_4$</code></td> <td><code>$\pi_5$</code></td> <td><code>$\pi_6$</code></td> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_2$</code></th> <td><code>$\pi_2$</code></td> <td><code>$\pi_1$</code></td> <td><code>$\pi_5$</code></td> <td><code>$\pi_6$</code></td> <td><code>$\pi_3$</code></td> <td><code>$\pi_4$</code></td> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_3$</code></th> <td><code>$\pi_3$</code></td> <td><code>$\pi_4$</code></td> <td><code>$\pi_1$</code></td> <td><code>$\pi_2$</code></td> <td><code>$\pi_6$</code></td> <td><code>$\pi_5$</code></td> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_4$</code></th> <td><code>$\pi_4$</code></td> <td><code>$\pi_3$</code></td> <td><code>$\pi_6$</code></td> <td><code>$\pi_5$</code></td> <td><code>$\pi_1$</code></td> <td><code>$\pi_2$</code></td> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_5$</code></th> <td><code>$\pi_5$</code></td> <td><code>$\pi_6$</code></td> <td><code>$\pi_2$</code></td> <td><code>$\pi_1$</code></td> <td><code>$\pi_4$</code></td> <td><code>$\pi_3$</code></td> </tr> <tr> <th style="border-right: 1px solid #000;"><code>$\pi_6$</code></th> <td><code>$\pi_6$</code></td> <td><code>$\pi_5$</code></td> <td><code>$\pi_4$</code></td> <td><code>$\pi_3$</code></td> <td><code>$\pi_2$</code></td> <td><code>$\pi_1$</code></td> </tr> </table></p> <p>Man sieht nun, und das finde ich durchaus erstaunlich, man landet immer wieder in <code>$S_3$</code>. Durch die Verkn&uuml;pfung von Permutationen kommt also <em>immer</em> wieder eine Permutation heraus! Das bedeutet, <code>$S_3$</code> ist unter dieser Verkn&uuml;pfung abgeschlossen. </p> <p>Man kann nun auch noch sehen, jedes Element aus <code>$(S_3, \circ)$</code> ein inverses hat, da in jeder Zeile ein mal <code>$\pi_1$</code> vorkommt.</p> <p>Au&szlig;erdem ist <code>$(S_3, \circ)$</code> assoziativ. </p> <p>Kurz: <code>$(S_3, \circ)$</code> ist eine Gruppe, die jedoch nicht abelsch ist.</p> <p>Es wurde in der Vorlesung auch gezeigt, dass allgemein <code>$(S_m, \circ)$</code> eine Gruppe ist.</p> <h3>Die Fehlstandszahl</h3> <div class="definition">Es sei `$\pi \in S_m$` eine Permutation. Die <strong>Fehlstandszahl</strong> `$F(\pi)$` von `$\pi$` ist die (eindeutige) Anzahl der F&auml;lle, in denen f&uuml;r `$i < k$` gilt `$\pi(i) > \pi(k)$`. Die Permutationen mit gerader Fehlstandszahl `$F(\pi)$` hei&szlig;en gerade, die Permutationen mit ungerader Fehlstandszahl hei&szlig;en ungerade.</div> <h4>Beispiele</h4> <p><code>$\pi_1 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 1 &amp; 2 &amp; 3 \end{pmatrix}$</code> hat die Fehlstandszahl 0.</p> <p><code>$\pi_2 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 1 &amp; 3 &amp; 2 \end{pmatrix}$</code> hat die Fehlstandszahl 1, da <code>$i = 2 &lt; 3 = k$</code> gilt, aber <code>$\pi_2(2) = 3 &gt; 2 = \pi_2(3)$</code>.</p> <p><code>$\pi_3 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 2 &amp; 1 &amp; 3 \end{pmatrix}$</code> hat die Fehlstandszahl 1.</p> <p><code>$\pi_4 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 3 &amp; 1 &amp; 2 \end{pmatrix}$</code> hat die Fehlstandszahl 2.</p> <p><code>$\pi_5 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 2 &amp; 3 &amp; 1 \end{pmatrix}$</code> hat die Fehlstandszahl 2.</p> <p><code>$\pi_6 = \begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 3 &amp; 2 &amp; 1 \end{pmatrix}$</code> hat die Fehlstandszahl 2.</p> <h2>Transposition</h2> <div class="definition">Eine  <strong>Transposition</strong> ist eine Permutation aus `$S_m$`, bei der zwei verschiedene, fest gewahlte Zahlen `$i, k \in \{1, 2, ..., m\}$` vertauscht werden, w&auml;hrend alle anderen Zahlen fest bleiben. Man schreibt fur diese Transposition auch kurz `$(i~k)$`.</div> <p>Transpositionen werden gerne mit <code>$\tau$</code> abgek&uuml;rzt.</p> <p>Also: <code>$\pi_2 = (2~3), \pi_3=(1~2), \pi_6 = (1~3)$</code> sind Transpositionen. <code>$\pi_1, \pi_4, \pi_5$</code> sind keine Transpositionen.</p> <p>Es gilt: <code>$\tau \circ \tau = id$</code></p> <p>wir haben in der Vorlesung gezeigt: <div class="satz">Jede Permutation <code>$\pi \in S_m, m \geq 2,$</code> l&auml;sst sich als Verkettung von Transpositionen darstellen.</div></p> <p>Beispiel: <code>$\sigma = \begin{pmatrix}1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 &amp; 6 \\ 6 &amp; 5 &amp; 4 &amp; 1 &amp; 3 &amp; 2\end{pmatrix} = (1~6) \circ (2~5) \circ (3~4) \circ (4~6) \circ (5~6)$</code></p> <p>Gelesen wird das ganze von rechts nach links. Die Transposition <code>$(5~6)$</code> wird also zuerst angewendet. Wie bei Abbildungen die verkettet werden halt auch.</p> <p>Die Fehlstandszahl von <code>$\sigma$</code> ist 13 und die Anzahl der Transpositionen ist ungerade.</p> <p>Interessanterweise gilt auch <code>$\sigma = (1~4) \circ (3~5) \circ (2~6) \circ (1~3) \circ (1~2)$</code>. Au&szlig;erdem kann man beliebig h&auml;ufig eine Transposition doppelt hinzuf&uuml;gen, da es ja die Identit&auml;t ist. Die Darstellung einer Permutation als folge von Transpositionen ist also nicht eindeutig.</p> <h2>Siehe auch</h2> <p>Wikipedia: <a href="http://de.wikipedia.org/wiki/Permutation">Permutation</a></p> Flags of the Earth http://martin-thoma.com/flags-of-the-earth Tue, 07 Aug 2012 15:00:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/flags-of-the-earth <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/07/flags-of-the-earth.png"><img src="../images/2012/07/flags-of-the-earth.png" alt="" width="512" height="370" class="size-full wp-image-37071"/></a><p class="wp-caption-text"></p></div> <p><strong>Go to the Game</strong>: <a href="http://www.kongregate.com/games/KingDotCom/flags">Flags on Kongregate</a> <strong>Task</strong>: Say which country the shown flag belongs to. <strong>How to play</strong>: Click on on of the 4 - 5 countries. <strong>My Record</strong>: 40 Flags and 12662 points.</p> Klausur Lineare Algebra I + II http://martin-thoma.com/klausur-lineare-algebra-i-ii Tue, 07 Aug 2012 07:35:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/klausur-lineare-algebra-i-ii <p>Dieser Artikel richtet sich vor allem an Studenten, die im Sommersemester 2012 bei Herrn Prof. Dr. Leuzinger am KIT die Klausur &uuml;ber Lineare Algebra und analytische Geometrie schreiben werden.</p> <p>Was ich im folgenden unter &quot;Themen&quot; schreibe, wurde von Prof. Dr. Leuzinger in der letzten Stunde aufgeschrieben. Das habe ich als Grundlage genommen und erg&auml;nzt. Er gab folgende Tipps: <ul> <li>Zeitplan aufstellen</li> <li>Aktiv lernen</li> </ul></p> <p>Ich kann als Tipp f&uuml;r die Klausur noch sagen: Wenn du eine Aufgabe (b) machst, &uuml;berleg dir, ob dir die Ergebnisse aus (a) helfen k&ouml;nnen! In den LA-Klausuren, die ich bisher gesehen habe, hat die vorangehende Teilaufgabe sehr h&auml;ufig eine Hilfestellung geboten.</p> <h2>Vorbereitung</h2> <h3>Lineare Algebra I</h3> <p>Ihr solltet auf jeden Fall die <a href="../lernkontrolle-lineare-algebra-i/" title="Lernkontrolle: Lineare Algebra I">Lernkontrolle: Lineare Algebra I</a> machen.</p> <h4>Themen</h4> <ul> <li><strong>Gruppen</strong>: Untergruppe, Homomorphismus/Isomorphismus, `$GL(n, \mathbb{K})$`</li> <li><strong>K&ouml;rper</strong>: `$\mathbb{R}, \mathbb{C}, \mathbb{Z}/p\mathbb{Z}$` (insbesondere `$p=2$`)</li> <li><strong>Vektorr&auml;ume</strong>: Basis, Basiserg&auml;nzungssatz, Dimension, Basiswechsel, `$V \cong \mathbb{K}^n$` (f&uuml;r `$\dim V = n$`); `$\dim (U_1 \oplus U_2) = \dim U_1 + \dim U_2$`</li> <li><strong>Lineare Abblidungen</strong> (Definitionen, Beispiele): <ul> <li>Lineare Fortsetzung, `$\phi: V \rightarrow W$`</li> <li>Dimensionssatz `$\dim \text{Bild} \phi = \dim V - \dim \phi^2$`</li> <li>`$\text{Hom}(V, W) \cong \mathbb{K}^{m \times n}$` Abbildungsmatrix</li> <li><b>Dualraum</b>: `$W = \mathbb{R}$`, `$V^* = \text{Hom}(V, \mathbb{K})$`</li> <li>`$\phi: V \rightarrow W$` A</li> <li>`$\phi: W* \rightarrow V*$` `$A^T$`</li> <li>duale Basis, duale Abbildung</li> <li>Basiswechsel f&uuml;r Endomorphismen, Formel</li> <li>`$\tilde{A} = S^{-1} A S$`, S = Matrix des Basiswechsels</li> </ul> </li> <li><strong>Determinante</strong>: <ul> <li>Laplacesche Entwicklungsformel (z.B. nach i-ter Spalte)</li> <li>`$\det A^T = \det A$`</li> <li>`$\det(A \cdot B) = \det A \cdot \det B$`</li> <li>`$\det(A^{-1}) = \frac{1}{\det A}$`</li> <li>`$\det \begin{pmatrix}A & * \\0 & B\end{pmatrix} = \det A \cdot det(B)$` ("K&auml;stchensatz")</li> <li>Bei beliebig gro&szlig;en Matrizen &agrave; la `$A \in \mathbb{R}^{n \times n}$` gibt es ein paar Dinge, die beim Suchen der Determinante hilfreich sein k&ouml;nnen: <ul> <li>Ist die Matrix symmetrisch? Falls ja, muss man sich nur die Zeilen anschauen. Falls nein, k&ouml;nnen die folgenden Tipps sowohl f&uuml;r die Zeilen als auch f&uuml;r die Spalten &uuml;berpr&uuml;ft werden.</li> <li>N&uuml;tzt es etwas, wenn ich auf die letzte Zeile alle vorherigen Zeilen addiere?</li> <li>Was passiert, wenn ich Zeile `$i$` auf Zeile `$(i+1)$` addiere f&uuml;r `$i \in 1, ..., (n-1)$`?</li> </ul> </li> </ul> </li> <li><a href="../wie-bestimme-ich-das-inverse-einer-matrix/">Wie bestimme ich das Inverse einer Matrix?</a></li> <li><strong>L&ouml;sungstheorie von LGSen</strong> (Gau&szlig;-Algorithmus)</li> <li><strong>Eigenwerte</strong>, Eigenvektoren (`$\phi(x) = \lambda x, x \neq 0$`)</li> <li>charakteristisches Polynom `$\phi|_{[x]} = \lambda_{id_{[x]}}$` - <a href="../wie-berechnet-man-das-charakteristische-polynom/">Wie berechnet man das charakteristische Polynom?</a></li> <li>`$\mathbb{K} = \mathbb{C} \leadsto$` <strong>Jordansche Normalform</strong> (Algorithmus)</li> </ul> <h4>Aufgabenstellungen</h4> <p>Mit diesen Aufgabentypen sollte man rechnen: <ul> <li>Gegeben sind zwei Untervektorr&auml;ume <code>$U, V$</code> des <code>$\mathbb{R}^4$</code>. Finden Sie jeweils eine Basis von <code>$U, V, U \cap V, U + V$</code>. &rarr; <a href="../wie-bildet-man-den-schnitt-zweier-vektorraume/">Erkl&auml;rung</a></li> <li>Bestimmen Sie alle L&ouml;sungen eines Gleichungssystems (auch in endlichen K&ouml;rpern wie <code>$\mathbb{Z} / 5 \mathbb{Z}$</code>!).</li> <li>Bestimmen Sie die Jordansche Normalform einter Matrix A. &rarr; <a href="../wie-berechnet-man-die-jordansche-normalform/">Erkl&auml;rung</a></li> </ul></p> <h4>Good to know</h4> <p>&Auml;hnlichkeitsinvariante Matrizeneigenschaften: <ul> <li>Rang</li> <li>Spur</li> <li>Determinante</li> <li>Jordansche Normalform</li> <li>Charakteristisches Polynom</li> </ul></p> <ul> <li><a href="http://math.stackexchange.com/a/14079/6876">Wie findet man heraus, ob zwei Matrizen &auml;hnlich sind?</a></li> <li><a href="http://de.wikipedia.org/wiki/Regul%C3%A4re_Matrix#Invertierbare_Matrizen_.C3.BCber_einem_K.C3.B6rper">Wann sind Matrizen regul&auml;r?</a></li> </ul> <h4>Siehe auch</h4> <ul> <li><a href="http://commons.wikimedia.org/wiki/File:Venn-diagramm-algebraische-strukturen.svg">&Uuml;bersicht &uuml;ber algebraische Strukturen</a></li> <li><a href="http://next-internet.com/la/texte/la_zusammenfassung.pdf">Zusammenfassung auf next-indernet.com</a></li> </ul> <h3>Lineare Algebra II</h3> <h4>Themen</h4> <ul> <li><strong>Vektorr&auml;ume mit Skalarprodukt</strong> (Definition, Beispiele, `$\mathbb{K} \in \{\mathbb{R}, \mathbb{C}\}$`)</li> <li>`$G = G^T$` (`$\mathbb{K} = \mathbb{R}$`)</li> <li>`$G = \bar{G}^T$` (`$\mathbb{K} = \mathbb{C}$`)</li> <li>Basiswechsel `$\tilde{G} = S^T G S$` (allgemeiner Basiswechsel)</li> <li>Basiswechsel `$\tilde{G} = S^{-1} G S$` (f&uuml;r ONB, da `$S^{-1} = S^T$`)</li> <li>Skalarprodukt induziert eine Norm, `$\| x \| = \sqrt{\langle x, x \rangle}$`</li> <li>Parallelogramm-Identit&auml;t: `$\|a+b\|^2 + \|a-b\|^2 = 2 \cdot (\|a\|^2 + \|b\|^2)$`</li> <li>`$\cos \omega(a,b) = \frac{\langle a, b \rangle}{\|a\| \cdot \| b \|}$`</li> <li>Orthogonal, ONB, Orthogonal-Komplement</li> <li>`$x \perp y$`, `$\langle x, y \rangle = 0$`</li> <li>orthogonale / unit&auml;re Matrizen: <ul> <li>`$S \cdot S^T = E$`</li> <li>`$\det S \cdot \det S^T = \det E = 1$`</li> <li>`$U \cdot \bar U^T = E$`</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Gram-Schmidtsches_Orthogonalisierungsverfahren">Gram-Schmidtsches Orthogonalisierungsverfahren</a>: `$w_j = v_j - \sum_{i=1}^{j-1} \frac{\langle v_j, w_i \rangle}{\langle w_i, w_i \rangle} \cdot w_i$`</li> <li>Projektion eines Vektors auf eine Ebene (&Uuml;B 4, A3)</li> <li>"Gute" Abbildungen bzgl. `$\langle, \rangle: \phi: V \rightarrow V$`</li> <li>(Selbst-)adjungierte: `$\langle \phi(x), y \rangle = \langle x, \phi*(y) \rangle \rightarrow A = A^T$`</li> <li>Lineare Isometrien `$\langle \phi(x), \phi(y) \rangle \rightarrow A$` orthogonal<br/>`$\varphi$` hei&szlig;t lineare Isometrie `$:\Leftrightarrow \langle \varphi(x), \varphi(y) \rangle = \langle x, y \rangle$`</li> <li>Abbildungsmatrizen bzgl. ONB</li> <li>Spektralsatz: `$\phi s.a. \Rightarrow \phi \text{ diagonalisierbar}, \exists S \in O(n) \text{ mit } S^{-1} A S = D$`.</li> <li>Abbildungsmatrizen bzgl. ONB</li> <li>`$\phi$` s.a. Basis: ONB `$\Rightarrow$` Abb. Matrix symmetrisch, aber noch mehr: `$\exists$` ONB aus EV mit Abb. Matrix = Diagonalmatrix (Spektralsatz)</li> <li>`$\phi$` lin. Isometrie, Basis ONB `$\Rightarrow$` Abb. Matrix ist orthogonal / unit&auml;r, aber noch mehr: `$\exists$` ONB mit Abb. in euklid NF</li> <li><strong><a href="../berechnung-der-euklidischen-normalform/">Berechnung der euklidischen Normalform</a></strong></li> <li>Kiterien f&uuml;r pos. definit (Ist geg. BF `$\beta$` ein SP?)</li> <li><a href="http://de.wikipedia.org/wiki/Hauptachsentransformation">Hauptachsentransformation</a></li> <li>`$(V, \langle , \rangle)$` VR mit SP. `$\beta = $` Bilinearform kann man simultan diagonalisieren `$\exists$` ONB von `$V$`, so dass Matrix von `$\langle, \rangle E_n$` (nach Definition von ONB)</li> <li><a href="http://de.wikipedia.org/wiki/Hurwitzpolynom#Hurwitz-Kriterium">Hurwitz-Kriterium</a></li> </ul> <p>Affine / Euklidische Geometrie <code>$\operatorname{Aff}(\mathbb{R}^n), \mathrm{Iso}(\mathbb{R}^n)$</code> Gruppe der Affinit&auml;t bzgl. Isometrie</p> <h2>Lernplan</h2> <p>Es empfiehlt sich, einen Lernplan aufzustellen. Wenn ich die &Uuml;bungsbl&auml;tter mache, dann lese ich mir zuerst die relevanten Kapitel im <a href="https://studium.kit.edu/sites/vab/0x40F0348A9ACDCE49A96EEE39EB076112/Vorlesungsunterlagen/Forms/AllItems.aspx">Skript</a> durch.</p> <h2>Termine und Klausurablauf</h2> <p><strong>Datum</strong>: Donnerstag, den 13. September 2012 von 08:00 bis 13:00 Uhr <strong>Ort</strong>: bei mir: <strike>Neue Chemie</strike> H&ouml;rsaal am Fasanengarten (&rarr; <a href="http://www.math.kit.edu/iag2/lehre/la2mathe20122012s/media/hoersaele-1.pdf">H&ouml;rsaaleinteilung</a>) <strong>Dauer</strong>: 2 h LA I, 1 h Pause, 2 h LA II <strong>Punkte</strong>: 6 Aufgaben &agrave; 4 Punkte f&uuml;r LA I, 6 Aufgaben &agrave; 4 Punkte f&uuml;r LA II <strong>Geschwindigkeit</strong>: <code>$\frac{5 \text{ Minuten}}{\text{Punkt}}$</code> <strong>&Uuml;bungsschein</strong>: Noch nicht im Studierendenportal (Stand: 11.09.2012) <strong>Bonuspunkte</strong>: Gibt es nicht.</p> <p><strong>Nicht vergessen</strong>: <ul> <li>Studentenausweis</li> <li>Leere Bl&auml;tter</li> <li>Essen und Trinken (4h Klausur!!!)</li> </ul> </p> <p>Ein paar interessante Aussagen: <blockquote>In den letzten Jahren reichten 20 Punkte zum bestehen</blockquote> <blockquote>In den letzten Jahren wurde jeweils im LA I und in LA II der beste Teil doppelt bepunktet</blockquote> <blockquote>Es gab bisher nur eine Gesamtnote f&uuml;r LA I und II, man musste die beiden Tests also nicht einzeln bestehen.</blockquote></p> <h2>Ergebnisse</h2> <p>Ich habe den &Uuml;bungsleiter mal angeschrieben. Das war seine Antwort: <blockquote> Der Termin ist normalerweise in der ersten Vorlesungswoche. Er wird auf der Kurshomepage rechtzeitig bekannt gegeben. </blockquote></p> <blockquote>Die Ergebnisse der Klausur werden am Freitag, den 05.10.2012, im Allianzgeb&auml;ude am schwarzen Brett neben 4A-09 ausgeh&auml;ngt.</blockquote> <p>Das ist vermutlich im Allianzbau.</p> <p>Die Klausureinsicht findet am Montag, den 15.10.2012 von 15:00 - 16:30 Uhr im Raum 1C-03 im Allianzgeb&auml;ude statt.</p> Globetrotter http://martin-thoma.com/globetrotter Mon, 06 Aug 2012 15:00:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/globetrotter <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/07/globetrotter-xl.png"><img src="../images/2012/07/globetrotter-xl.png" alt="" width="512" height="384" class="size-full wp-image-37021"/></a><p class="wp-caption-text"></p></div> <p><strong>Go to the Game</strong>: <a href="http://www.kongregate.com/games/crafics/globetrotter-xl">Globetrotter XL</a> on Kongregate <strong>Task</strong>: Find a city on a map <strong>How to play</strong>: You&#39;re given the name of a city and its country and a map. In the first levels this map has borders, but no names of countries or cities. In the later levels even the borders are not shown. <strong>My Record</strong>: Level 6, about 1400 points</p> Java Puzzle #7: Inheritance and Visibility http://martin-thoma.com/java-puzzle-7-inheritance-and-visibility Sun, 05 Aug 2012 15:00:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-7-inheritance-and-visibility <p>You are given the following two classes: <strong>Animal.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Animal</span> <span class="o">{</span> <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">120</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <p><strong>Tiger.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Tiger</span> <span class="kd">extends</span> <span class="n">Animal</span> <span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="n">height</span><span class="o">;</span> <span class="o">}</span> </code></pre></div> <p>What is the output of the following three snippets: <strong>test1.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test1</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Tiger</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Tiger</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">height</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>test2.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test2</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Animal</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Tiger</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">height</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>test3.java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test3</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Animal</span> <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Animal</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">t</span><span class="o">.</span><span class="na">height</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <p><strong>test1.java</strong>:</p> <div class="highlight"><pre><code class="bash">0 </code></pre></div> <p><strong>test2.java</strong>:</p> <div class="highlight"><pre><code class="bash">Exception in thread <span class="s2">&quot;main&quot;</span> java.lang.Error: Unresolved compilation problem: The field Animal.height is not visible at test.main<span class="o">(</span>test.java:4<span class="o">)</span> </code></pre></div> <p><strong>test3.java</strong>:</p> <div class="highlight"><pre><code class="bash">Exception in thread <span class="s2">&quot;main&quot;</span> java.lang.Error: Unresolved compilation problem: The field Animal.height is not visible at test.main<span class="o">(</span>test.java:4<span class="o">)</span> </code></pre></div> Java Puzzle #6: Double Arithmetic http://martin-thoma.com/java-puzzle-6-double-arithmetic Sat, 04 Aug 2012 15:00:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-6-double-arithmetic <p>What is the output of the following snippet?</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">a</span> <span class="o">=</span> <span class="mf">1.3378901234567877</span><span class="o">;</span> <span class="kt">double</span> <span class="n">b</span> <span class="o">=</span> <span class="mf">0.0008901234567876</span><span class="o">;</span> <span class="kt">double</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">c</span> <span class="o">==</span> <span class="mf">1.337</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Hallo doubles!&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Oh no! Comparison failed!&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . <h2>Solution</h2></p> <div class="highlight"><pre><code class="bash">Oh no! Comparison failed! </code></pre></div> <h2>Explanation</h2> <p>Doubles are internally represented using the <a href="http://en.wikipedia.org/wiki/IEEE_floating_point">IEEE 754 standard</a> (<a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html">source</a>). This means, doubles are not represented with arbitrary precision.</p> <p>Just execute this snippet:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">a</span> <span class="o">=</span> <span class="mf">1.3378901234567876</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;a = &quot;</span> <span class="o">+</span> <span class="n">a</span><span class="o">);</span> <span class="kt">double</span> <span class="n">b</span> <span class="o">=</span> <span class="mf">0.0008901234567876</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;b = &quot;</span> <span class="o">+</span> <span class="n">b</span><span class="o">);</span> <span class="kt">double</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;c = &quot;</span> <span class="o">+</span> <span class="n">c</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash"><span class="nv">a</span> <span class="o">=</span> 1.3378901234567877 <span class="nv">b</span> <span class="o">=</span> 8.901234567876E-4 <span class="nv">c</span> <span class="o">=</span> 1.3370000000000002 </code></pre></div> <h2>Resolve problem</h2> <p>Use an appropriate epsilon to compare floats/doubles:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">a</span> <span class="o">=</span> <span class="mf">1.3378901234567877</span><span class="o">;</span> <span class="kt">double</span> <span class="n">b</span> <span class="o">=</span> <span class="mf">0.0008901234567876</span><span class="o">;</span> <span class="kt">double</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span><span class="o">;</span> <span class="kt">double</span> <span class="n">EPSILON</span> <span class="o">=</span> <span class="mf">0.000000000000001</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">c</span> <span class="o">-</span> <span class="mf">1.337</span><span class="o">)</span> <span class="o">&lt;</span> <span class="n">EPSILON</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Hallo doubles!&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Oh no! Comparison failed!&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> Übersicht der Pfeile in UML http://martin-thoma.com/ubersicht-der-pfeile-in-uml Sat, 04 Aug 2012 07:23:29 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ubersicht-der-pfeile-in-uml <p>Folgende Pfeile werden in UML verwendet: <h2>Klassendiagramme</h2> <h3>Vererbung</h3> <div style="width: 77px" class="wp-caption alignright"><a href="../images/2012/07/UML-vererbung.png"><img src="../images/2012/07/UML-vererbung.png" alt="" width="77" height="135" class="size-full wp-image-32841 "/></a><p class="wp-caption-text"></p></div> Die <a href="http://de.wikipedia.org/wiki/Vererbung_(Programmierung)">Vererbung</a> ist eines der wichtigsten Prinzipien der objektorientierten Programmierung. Sie zeigt eine &quot;ist ein&quot;-Beziehung an.</p> <p>Beispiele sind: <ul> <li><code>Tiger</code> ist eine <code>Gro&szlig;katze</code> ist eine <code>Katze</code> ist ein <code>Raubtier</code> ist ein <code>Tier</code>.</li> <li><code>Auto</code> ist ein <code>Fortbewegungsmittel</code>.</li> <li><code>Auto</code> ist ein <code>Luxusgut</code>.</li> </ul></p> <p>Beachte dass <code>Auto</code> hier sowohl von <code>Luxusgut</code>, als auch von <code>Fortbewegungsmittel</code> erbt. Das geht in manchen Programmiersprachen (C++, Python), in anderen nicht (Java). </p> <h3>Assoziation</h3> <div style="width: 77px" class="wp-caption alignright"><a href="../images/2012/07/UML-assoziation.png"><img src="../images/2012/07/UML-assoziation.png" alt="" width="77" height="154" class="size-full wp-image-32901 "/></a><p class="wp-caption-text"></p></div> <p>Die <a href="http://de.wikipedia.org/wiki/Assoziation_(UML)">Assoziation</a>zeigt eine Verbindung an, z.B.: <ul> <li>Person - Termin: Eine Person hat Termine; Termine geh&ouml;ren zu einer Person.</li> <li>Lehrer - Sch&uuml;ler: Ein Sch&uuml;ler hat Lehrer; Lehrer haben Sch&uuml;ler.</li> <li>Auto - Fahrer: Ein Auto hat einen Fahrer; ein Fahrer hat ein Auto.</li> </ul> In einer Datenbank w&uuml;rde man f&uuml;r diese Relationen eine weitere Tabelle erstellen. Also eine Tabelle f&uuml;r Personen, eine f&uuml;r Termine und eine f&uuml;r Person-Termin-Verkn&uuml;pfungen. <h3>Aggregation</h3> <div style="width: 77px" class="wp-caption alignright"><a href="../images/2012/07/UML-aggregation.png"><img src="../images/2012/07/UML-aggregation.png" alt="" width="77" height="155" class="size-full wp-image-32871 "/></a><p class="wp-caption-text"></p></div></p> <p>Die <a href="http://de.wikipedia.org/wiki/Assoziation_(UML)#Aggregation">Aggregation</a> ist eine spezielle Assoziation. Sie zeigt eine &quot;hat&quot;-Beziehung an. Dabei ist die Richtung wichtig und sollte angezeigt werden.</p> <p>Aggregationen sind z.B.: <ul> <li>PKW hat R&auml;der</li> <li>Eltern haben Kinder</li> <li>Buchladen hat B&uuml;cher</li> </ul> <h3>Komposition</h3> <div style="width: 77px" class="wp-caption alignright"><a href="../images/2012/07/UML-komposition.png"><img src="../images/2012/07/UML-komposition.png" alt="" width="77" height="155" class="size-full wp-image-32891 "/></a><p class="wp-caption-text"></p></div></p> <p>Die <a href="http://de.wikipedia.org/wiki/Komposition_(UML)#Komposition">Komposition</a> zeigt eine notwendige &quot;ist-Teil-von&quot; Beziehung an. Das Teil kann also nicht ohne das Ganze existieren.</p> <p>Beispiele sind: <ul> <li>Buch hat Buchseiten (Buchseiten gibt es nicht ohne Buch)</li> <li>Rechnung hat Posten (Rechnungsposten gibt es nicht ohne Rechnung)</li> <li>Graph hat Knoten (Knoten gibt es nicht ohne Graph)</li> </ul></p> <h3>Weitere</h3> <ul> <li>Die Benutzt-Relation wird als gestrichelter Pfeil mit nicht-ausgef&uuml;lltem Kopf dargestellt.</li> <li>Eine Implementierung wird als gestrichelter Pfeil mit rundem, nicht ausgef&uuml;lltem Kopf dargestellt.</li> </ul> <h2>Objektdiagramme</h2> <div style="width: 404px" class="wp-caption aligncenter"><a href="../images/2012/07/objektdiagramm-instance-of.png"><img src="../images/2012/07/objektdiagramm-instance-of.png" alt="" width="404" height="77" class="size-full wp-image-36561"/></a><p class="wp-caption-text"></p></div> <h2>Sequenzdiagramme</h2> <p><a href="http://de.wikipedia.org/wiki/Sequenzdiagramm">Sequenzdiagramme</a> haben wieder eigene Pfeile. <div style="width: 421px" class="wp-caption aligncenter"><a href="../images/2012/07/sequenzdiagram.png"><img src="../images/2012/07/sequenzdiagram.png" alt="" width="421" height="259" class="size-full wp-image-32951"/></a><p class="wp-caption-text"></p></div> Der Pfeil mit der ausgef&uuml;llten Spitze ist eine Synchrone Nachricht, der gestrichelte mit der nicht-ausgef&uuml;llten Spitze ist eine Antwort und der durchgezogenen Pfeil mit der nicht-ausgef&uuml;llten Spitze ist eine asynchrone Nachricht. <strong>ACHTUNG</strong>: In der Vorlesung bei Herrn Prof. Tichy hat die Antwort (Folie 42) auch keinen ausgef&uuml;llten Kopf, im gegensatz zu dem hier gezeigtem Bild!</p> <h2>Siehe auch</h2> <ul> <li><a title="How to create UML class diagrams" href="../how-to-create-uml-class-diagrams/">How to create UML class diagrams</a></li> </ul> Java Puzzle #5: Parallel Programming, Part 2 http://martin-thoma.com/java-puzzle-5-parallel-programming-part-2 Fri, 03 Aug 2012 15:00:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-5-parallel-programming-part-2 <p>What is the output of the following script:</p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">int</span> <span class="n">globalVar</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">globalVar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">MyParallelClass</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">();</span> <span class="n">MyParallelClass</span> <span class="n">b</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">globalVar</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div><div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyParallelClass</span> <span class="kd">implements</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runnable</span> <span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">test</span><span class="o">.</span><span class="na">globalVar</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">1000000</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="n">counter</span><span class="o">++;</span> <span class="o">}</span> <span class="n">test</span><span class="o">.</span><span class="na">globalVar</span><span class="o">--;</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <p><code>0</code>, <code>1</code> or <code>-1</code>.</p> <h2>Explanaition</h2> <p>First the simple ones: <code>0</code> is the result you would expect. One thread executes and reduces <code>globalVar</code> to <code>0</code>, the other one does nothing and then <code>globalVar</code> gets printed.</p> <p>If the main program is faster than any of the two threads, it prints <code>1</code> before <code>globalVar</code> gets reduced.</p> <p>Now the most interesting one: <code>-1</code>. This is called a <a href="http://en.wikipedia.org/wiki/Race_condition">race condition</a>. You have to know that <code>globalVar--</code> is not an atomic operation. First you have to get the value, then you have to reduce it and after that you can save the value.</p> <p>This is an order of execution which would lead to a wrong value: <table> <tr> <th>First Thread</th> <th>Second Thread</th> <th>test.globalVar</th> </tr> <tr> <td> <div class="highlight"><pre><code class="text">checks if (globalVar &gt; 0) looping ... looping ... execute test.globalVar--; </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">. checks if (globalVar &gt; 0) execute all four bytecode commands of &quot;test.globalVar--;&quot; . </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">1 1 0 -1 </code></pre></div> </td> </tr> </table></p> <h2>Resolve this problem</h2> <ul> <li>Use <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()">join()</a> if you don't want to get <code>1</code> as output.</li> <li>If you don't want to get <code>-1</code>, you should take a look at the keyword <a href="http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html">synchronised</a>.</li> </ul> <h2>A side note</h2> <p>With <code>javap -c MyParallelClass</code> you can view the <a href="http://en.wikipedia.org/wiki/Java_bytecode">bytecode</a> of the class <code>MyParallelClass</code>. It looks like this:</p> <div class="highlight"><pre><code class="java"><span class="n">Compiled</span> <span class="n">from</span> <span class="s">&quot;MyParallelClass.java&quot;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyParallelClass</span> <span class="kd">extends</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Object</span> <span class="kd">implements</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runnable</span><span class="o">{</span> <span class="kd">public</span> <span class="kt">int</span> <span class="n">counter</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">MyParallelClass</span><span class="o">();</span> <span class="nl">Code:</span> <span class="mi">0</span><span class="o">:</span> <span class="n">aload_0</span> <span class="mi">1</span><span class="o">:</span> <span class="n">invokespecial</span> <span class="err">#</span><span class="mi">1</span><span class="o">;</span> <span class="c1">//Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V</span> <span class="mi">4</span><span class="o">:</span> <span class="n">aload_0</span> <span class="mi">5</span><span class="o">:</span> <span class="n">iconst_0</span> <span class="mi">6</span><span class="o">:</span> <span class="n">putfield</span> <span class="err">#</span><span class="mi">2</span><span class="o">;</span> <span class="c1">//Field counter:I</span> <span class="mi">9</span><span class="o">:</span> <span class="k">return</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">();</span> <span class="nl">Code:</span> <span class="mi">0</span><span class="o">:</span> <span class="n">getstatic</span> <span class="err">#</span><span class="mi">3</span><span class="o">;</span> <span class="c1">//Field test.globalVar:I</span> <span class="mi">3</span><span class="o">:</span> <span class="n">ifle</span> <span class="mi">38</span> <span class="mi">6</span><span class="o">:</span> <span class="n">iconst_0</span> <span class="mi">7</span><span class="o">:</span> <span class="n">istore_1</span> <span class="mi">8</span><span class="o">:</span> <span class="n">iload_1</span> <span class="mi">9</span><span class="o">:</span> <span class="n">ldc</span> <span class="err">#</span><span class="mi">4</span><span class="o">;</span> <span class="c1">//int 1000000</span> <span class="mi">11</span><span class="o">:</span> <span class="n">if_icmpge</span> <span class="mi">30</span> <span class="mi">14</span><span class="o">:</span> <span class="n">aload_0</span> <span class="mi">15</span><span class="o">:</span> <span class="n">dup</span> <span class="mi">16</span><span class="o">:</span> <span class="n">getfield</span> <span class="err">#</span><span class="mi">2</span><span class="o">;</span> <span class="c1">//Field counter:I</span> <span class="mi">19</span><span class="o">:</span> <span class="n">iconst_1</span> <span class="mi">20</span><span class="o">:</span> <span class="n">iadd</span> <span class="mi">21</span><span class="o">:</span> <span class="n">putfield</span> <span class="err">#</span><span class="mi">2</span><span class="o">;</span> <span class="c1">//Field counter:I</span> <span class="mi">24</span><span class="o">:</span> <span class="n">iinc</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">1</span> <span class="mi">27</span><span class="o">:</span> <span class="k">goto</span> <span class="mi">8</span> <span class="mi">30</span><span class="o">:</span> <span class="n">getstatic</span> <span class="err">#</span><span class="mi">3</span><span class="o">;</span> <span class="c1">//Field test.globalVar:I</span> <span class="mi">33</span><span class="o">:</span> <span class="n">iconst_1</span> <span class="mi">34</span><span class="o">:</span> <span class="n">isub</span> <span class="mi">35</span><span class="o">:</span> <span class="n">putstatic</span> <span class="err">#</span><span class="mi">3</span><span class="o">;</span> <span class="c1">//Field test.globalVar:I</span> <span class="mi">38</span><span class="o">:</span> <span class="k">return</span> <span class="o">}</span> </code></pre></div> <p>Some links to the reference: <a href="https://www.vmth.ucdavis.edu/incoming/Jasmin/ref--19.html">getstatic</a>, <a href="https://www.vmth.ucdavis.edu/incoming/Jasmin/ref--21.html">iconst<em>1</a>, &lt;a href=&quot;https://www.vmth.ucdavis.edu/incoming/Jasmin/ref-</em>isub.html&quot;&gt;isub</a>, <a href="https://www.vmth.ucdavis.edu/incoming/Jasmin/ref-putstati.html">putstatic</a></p> <p>The interesting part of the bytecode is:</p> <div class="highlight"><pre><code class="java"> <span class="mi">30</span><span class="o">:</span> <span class="n">getstatic</span> <span class="err">#</span><span class="mi">3</span><span class="o">;</span> <span class="c1">//Field test.globalVar:I</span> <span class="mi">33</span><span class="o">:</span> <span class="n">iconst_1</span> <span class="mi">34</span><span class="o">:</span> <span class="n">isub</span> <span class="mi">35</span><span class="o">:</span> <span class="n">putstatic</span> <span class="err">#</span><span class="mi">3</span><span class="o">;</span> <span class="c1">//Field test.globalVar:I</span> </code></pre></div> <p>You can see that the JVM has to execute 4 commands for <code>test.globalVar--;</code>. </p> <h2>See also</h2> <ul> <li><a href="http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html">Atomic Access</a> in Java</li> <li><a href="http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/Monitor.html">Class Monitor</a></li> <li><a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter">monitorenter</a> and <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorexit">monitorexit</a></li> <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html">Package java.util.concurrent</a></li> </ul> Shortfilms, Part II http://martin-thoma.com/shortfilms-part-ii Thu, 02 Aug 2012 21:59:53 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/shortfilms-part-ii <div class="info">Here is the first part "<a href="../shortfilms/">Shortfilms</a>".</div> <p>Here are some nice shortfilms in high quality. If you missed the first part, here is the article &quot;<a href="../shortfilms/" title="Shortfilms">shortfilms</a>&quot; (Part I).</p> <h2>The Last Train</h2> <iframe src="http://player.vimeo.com/video/31215588" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Mac 'n' Cheese</h2> <iframe src="http://player.vimeo.com/video/27127177" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Electroshock</h2> <iframe src="http://player.vimeo.com/video/29193046" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Mytho Logique</h2> <iframe src="http://player.vimeo.com/video/24258323" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Impossible Present</h2> <iframe src="http://player.vimeo.com/video/33352381?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>The Tale Of Mr. R&ecirc;vus</h2> <iframe src="http://player.vimeo.com/video/27653079?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="512" height="218" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Holy Sheep</h2> <iframe src="http://player.vimeo.com/video/24474457?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <h2>Danger Planet</h2> <iframe src="http://player.vimeo.com/video/28043193?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> SWT I Klausur http://martin-thoma.com/swt-i-klausur Thu, 02 Aug 2012 18:16:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/swt-i-klausur <p>F&uuml;r die Klausur in Softwaretechnik I 2012 bei Herrn Prof. Dr. Tichy sollte man Folgendes auf jeden Fall wissen: <ul> <li>Wie lautet der Aufbau des Wasserfallmodells?</li> <li>Was ist ein Sequenzdiagramm und wie sieht es aus? &rarr; <a href="http://de.wikipedia.org/wiki/Sequenzdiagramm">Antwort</a></li> <li>Wozu dient ein Aktivit&auml;tsdiagramm und wie sieht es aus? &rarr; <a href="http://de.wikipedia.org/wiki/Aktivit%C3%A4tsdiagramm">Antwort</a></li> <li>Wozu dienen die 21 Entwurfsmuster? &rarr; Siehe <a href="http://www.jetpunk.com/user-quizzes/27013/entwurfsmuster">mein Spiel</a> und <a href="http://www.vincehuston.org/dp/patterns_quiz.html">weiteres Spiel</a></li> <li>Wie sehen die Strukturmuster der 21 Entwurfmuster aus? &rarr; Siehe Kapitel 3.5</li> <li>Was wird zuerst erstellt: Das Lastenheft oder das Pflichtenheft? &rarr; <a href="http://de.wikipedia.org/wiki/Lastenheft">Antwort</a></li> <li>Welche zwei M&ouml;glichkeiten gibt es in Java, um eine Aufgabe parallel auszuf&uuml;hren? Was sind die Vor- und Nachteile? &rarr; <a href="http://stackoverflow.com/a/11774135/562769">Antwort</a></li> <li>Wie nennt man die Schl&uuml;sselw&ouml;rter der Art <code>@Test</code>, <code>@Before</code> und <code>@BeforeClass</code>? Was bewirken diese Schl&uuml;sselw&ouml;rter in JUnit? &rarr; <a href="http://www.vogella.com/articles/JUnit/article.html#usingjunit_annotations">Antwort</a></li> <li>Wozu dient JFrame? &rarr; <a href="../how-to-use-swing/" title="Swing I: How to use Swing">Antwort</a></li> </ul></p> <h2>Hinweise</h2> <blockquote><ul> <li>In den 60 Minuten Bearbeitungszeit haben Sie keine Zeit zum "Probemalen" oder "in Sch&ouml;nschrift nochmal abschreiben" vom Schmierblatt. Wenn es irgendwie geht, schreiben Sie Ihre L&ouml;sung gleich in lesbarer (!) Reinschrift.</li> <li>Die Farben rot und gr&uuml;n d&uuml;rfen Sie nicht verwenden.</li> <li>Was mit Bleistift geschrieben oder nicht entzifferbar ist, werten wir nicht.</li> <li>Es sind keine Hilfsmittel erlaubt.</li> <li>Sie brauchen kein Papier mitzubringen.</li> </ul></blockquote> <p>Aus dem Mailman-Verteiler von Herrn Karcher.</p> <h2>Termine</h2> <p><strong>Datum</strong>: Montag, den 06.08.2012 um 14:00 Uhr <strong>Ort</strong>: A - E: HSaF (Geb. 50.35) F - K: Gerthsen (Geb. 30.21) L - Q: Benz (Geb. 10.21) R&ndash;S: Gaede (Geb. 30.22) T&ndash;Z: Daimler (Geb. 10.21)</p> <p><strong>Dauer</strong>: 60 min. <strong>Punkte</strong>: 60 <strong>&Uuml;bungsschein</strong>: Noch nicht im <a href="https://studium.kit.edu">Studierendenportal</a> (Stand: 02.08.2012) <strong>Bonuspunkte</strong>: Gibt es nicht, oder? <strong>Sitzplatzverteilung</strong>: ?</p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Klausurergebnisse</h2> <div style="width: 800px" class="wp-caption aligncenter"><a href="../images/2012/08/swt-1-klausur.png"><img src="../images/2012/08/swt-1-klausur.png" alt="" width="800" height="455" class="size-full wp-image-39581"/></a><p class="wp-caption-text"></p></div> <p><strong>Klausureinsicht</strong>: Montag, den 13.08.2012 von 14:00 bis 16:00 Uhr, SR 348, Infobau</p> Nature by Numbers http://martin-thoma.com/nature-by-numbers Thu, 02 Aug 2012 15:00:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/nature-by-numbers <iframe src="http://player.vimeo.com/video/9953368" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <p>A short movie inspired by numbers, geometry and nature.</p> Java Puzzle #4: Parallel Programming http://martin-thoma.com/java-puzzle-4-parallel-programming Thu, 02 Aug 2012 09:00:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-4-parallel-programming <p>What is the output of the following Java Snippet:</p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyParallelClass</span> <span class="kd">implements</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">Runnable</span> <span class="o">{</span> <span class="kd">public</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">myParallelTry</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span> <span class="o">}</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">name</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div><div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">MyParallelClass</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">(</span><span class="s">&quot;A&quot;</span><span class="o">);</span> <span class="n">MyParallelClass</span> <span class="n">b</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">(</span><span class="s">&quot;B&quot;</span><span class="o">);</span> <span class="n">MyParallelClass</span> <span class="n">c</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">(</span><span class="s">&quot;C&quot;</span><span class="o">);</span> <span class="n">MyParallelClass</span> <span class="n">d</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyParallelClass</span><span class="o">(</span><span class="s">&quot;D&quot;</span><span class="o">);</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">).</span><span class="na">start</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <table> <tr> <th>First Try</th> <th>Second Try</th> <th>Third Try</th> </tr> <tr> <td> <div class="highlight"><pre><code class="text">A C B - D A B C - D A - C A C D B B D </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">A B C - D A B C - D A B C - D A B C D </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">A B C - D A B C - D A B C - D A B C D </code></pre></div> </td> </tr> </table> <h2>Explanation</h2> <p>If you start threads like this, you don&#39;t get any guarantee that they will finish their execution in order. If you want them to execute in block of four, you could use <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()">join()</a>:</p> <div class="highlight"><pre><code class="java language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">myParallelTry</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">myParallelTry</span><span class="o">(</span><span class="s">&quot;A&quot;</span><span class="o">);</span> <span class="n">myParallelTry</span> <span class="n">b</span> <span class="o">=</span> <span class="k">new</span> <span class="n">myParallelTry</span><span class="o">(</span><span class="s">&quot;B&quot;</span><span class="o">);</span> <span class="n">myParallelTry</span> <span class="n">c</span> <span class="o">=</span> <span class="k">new</span> <span class="n">myParallelTry</span><span class="o">(</span><span class="s">&quot;C&quot;</span><span class="o">);</span> <span class="n">myParallelTry</span> <span class="n">d</span> <span class="o">=</span> <span class="k">new</span> <span class="n">myParallelTry</span><span class="o">(</span><span class="s">&quot;D&quot;</span><span class="o">);</span> <span class="n">Thread</span> <span class="n">tA</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">);</span> <span class="n">tA</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">Thread</span> <span class="n">tB</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">);</span> <span class="n">tB</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">Thread</span> <span class="n">tC</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">);</span> <span class="n">tC</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">Thread</span> <span class="n">tD</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">);</span> <span class="n">tD</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">tA</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tB</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tC</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tD</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="n">tA</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">);</span> <span class="n">tA</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tB</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">);</span> <span class="n">tB</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tC</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">);</span> <span class="n">tC</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tD</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">);</span> <span class="n">tD</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">tA</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tB</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tC</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tD</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="n">tA</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">);</span> <span class="n">tA</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tB</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">);</span> <span class="n">tB</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tC</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">);</span> <span class="n">tC</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tD</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">);</span> <span class="n">tD</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">tA</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tB</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tC</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tD</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">);</span> <span class="n">tA</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">a</span><span class="o">);</span> <span class="n">tA</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tB</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">b</span><span class="o">);</span> <span class="n">tB</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tC</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">c</span><span class="o">);</span> <span class="n">tC</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="n">tD</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="n">d</span><span class="o">);</span> <span class="n">tD</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">tA</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tB</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tC</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="n">tD</span><span class="o">.</span><span class="na">join</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <table> <tr> <th>First Try</th> <th>Second Try</th> <th>Third Try</th> </tr> <tr> <td> <div class="highlight"><pre><code class="text">A B D C - A B C D - A B C D - A B C D </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">A B C D - A B C D - A B C D - A B C D </code></pre></div> </td> <td> <div class="highlight"><pre><code class="text">A B C D - A B C D - A B C D - A B C D </code></pre></div> </td> </tr> </table> Python Puzzle #2: None and False http://martin-thoma.com/python-puzzle-2-none-and-false Wed, 01 Aug 2012 15:00:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-puzzle-2-none-and-false <p>Python automatically casts to boolean if you use another type of variable for a boolean expression.</p> <p>Here is an example:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">if</span> <span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Crazy, &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="mi">1</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;this &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="mi">2</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;is &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="bp">True</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;also &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="s">&quot;a string&quot;</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;true.&quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;This &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;is &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;not &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">[]:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;true.&quot;</span><span class="p">)</span> </code></pre></div> <p>Everything gets printed.</p> <p>Now the riddle. What is the output of the following script:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">if</span> <span class="bp">None</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;None is false.&quot;</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;None and false are not equal.&quot;</span><span class="p">)</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="bash">None and <span class="nb">false </span>are not equal. </code></pre></div> <h2>Explanation</h2> <p>Although <code>None</code> and <code>False</code> evaluate to <code>False</code> if they are used in a boolean expression, <code>None</code> is not the same as <code>False</code>.</p> How to write music with LaTeX http://martin-thoma.com/how-to-write-music-with-latex Wed, 01 Aug 2012 08:45:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-write-music-with-latex <p>It is possible to write music with LaTeX. My girlfriend was quite surprised of this, so I decided to <del datetime="2012-08-01T08:01:06+00:00">write a little tutorial</del> show some examples. </p> <h2>Symbols</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/music-notes.png"><img src="../images/2012/08/music-notes.png" alt="" width="512" height="42" class="size-full wp-image-37171"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper,12pt]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>wasysym<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\eighthnote</span> ~~~ <span class="k">\halfnote</span> ~~~ <span class="k">\twonotes</span> ~~~ <span class="k">\fullnote</span> ~~~ <span class="k">\quarternote</span> ~~~ `<span class="s">$</span><span class="nv">\natural</span><span class="s">$</span>` ~~~ `<span class="s">$</span><span class="nv">\flat</span><span class="s">$</span>` ~~~ `<span class="s">$</span><span class="nv">\sharp</span><span class="s">$</span>` <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <p>The harmony package offers some additional symbols: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/latex-music-harmony.png"><img src="../images/2012/08/latex-music-harmony.png" alt="" width="512" height="331" class="size-full wp-image-37181"/></a><p class="wp-caption-text"></p></div></p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper,12pt]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>harmony<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\noindent</span> <span class="k">\AAcht</span> ~~~ <span class="k">\Acht</span> ~~~ <span class="k">\AchtBL</span> ~~~ <span class="k">\AchtBR</span> ~~~ <span class="k">\AcPa</span> <span class="k">\\</span> <span class="k">\DD</span> ~~~ <span class="k">\DDohne</span> ~~~ <span class="k">\Dohne</span> ~~~ <span class="k">\Ds</span> ~~~ <span class="k">\DS</span> <span class="k">\\</span> <span class="k">\Ganz</span> ~~~ <span class="k">\GaPa</span> ~~~ <span class="k">\Halb</span> ~~~ <span class="k">\HaPa</span> ~~~ <span class="k">\Pu</span> ~~~ <span class="k">\Sech</span> <span class="k">\\</span> <span class="k">\SechBL</span> ~~~ <span class="k">\SechBl</span> ~~~ <span class="k">\SechBR</span> ~~~ <span class="k">\SePa</span> ~~~ <span class="k">\UB</span> ~~~ <span class="k">\Vier</span> <span class="k">\\</span> <span class="k">\ViPa</span> ~~~ <span class="k">\VM</span> ~~~ <span class="k">\Zwdr</span> ~~~ <span class="k">\ZwPa</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>musixtex</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/08/latex-musixtex.png"><img src="../images/2012/08/latex-musixtex.png" alt="" width="512" height="139" class="size-full wp-image-37221"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper,12pt]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>musixtex<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\noindent</span> This is a clef: <span class="k">\begin</span><span class="nb">{</span>music<span class="nb">}</span><span class="k">\trebleclef\end</span><span class="nb">{</span>music<span class="nb">}</span> - a simple example<span class="k">\\</span> for the <span class="k">\LaTeX</span><span class="nb">{}</span> package musixtex. <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>ABC</h2> <h3>Preparation</h3> <p>You have to have ABC installed. For Ubuntu-Users:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">sudo apt-get install abcm2ps </code></pre></div> <h3>Example</h3> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>abc<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> You can create music sheets within the abc-environment: <span class="k">\begin</span><span class="nb">{</span>abc<span class="nb">}</span>[name=c-dur] X: 1 <span class="c">% start of header</span> K: C <span class="c">% scale: C major</span> &quot;Text&quot;c2 G4 | (3FED c4 G2 | <span class="k">\end</span><span class="nb">{</span>abc<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <p>compile with</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">pdflatex --shell-escape myTexFile.tex </code></pre></div> <p>to get this: <div style="width: 477px" class="wp-caption aligncenter"><a href="../images/2012/07/abc-example.png"><img src="../images/2012/07/abc-example.png" alt="" width="477" height="113" class="size-full wp-image-33701"/></a><p class="wp-caption-text"></p></div></p> <h2>LilyPond</h2> <h3>Preparation</h3> <p>Make sure that you have installed <a href="http://en.wikipedia.org/wiki/GNU_LilyPond">GNU LilyPond</a> and LaTeX. </p> <p>Ubuntu-Users have to type</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">sudo apt-get install lilypond </code></pre></div> <p>to install Lilypond.</p> <h3>Example</h3> <h4>From the Documentation</h4> <p>Save the following source as <code>lilybook.lytex</code>:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> Documents for <span class="k">\verb</span>+lilypond-book+ may freely mix music and text. For example, <span class="k">\begin</span><span class="nb">{</span>lilypond<span class="nb">}</span> <span class="k">\relative</span> c&#39; <span class="nb">{</span> c2 g&#39;2 <span class="k">\times</span> 2/3 <span class="nb">{</span> f8 e d <span class="nb">}</span> c&#39;2 g4 <span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>lilypond<span class="nb">}</span> Options are put in brackets. <span class="k">\begin</span><span class="na">[fragment,quote,staffsize=26,verbatim]</span><span class="nb">{</span>lilypond<span class="nb">}</span> c&#39;4 f16 <span class="k">\end</span><span class="nb">{</span>lilypond<span class="nb">}</span> Larger examples can be put into a separate file, and introduced with <span class="k">\verb</span>+<span class="k">\lilypondfile</span>+. <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <p>Compile it with these commands:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">lilypond-book --output<span class="o">=</span>out --pdf lilybook.lytex <span class="nb">cd </span>out/ pdflatex lilybook mv lilybook.pdf ../lilybook.pdf <span class="nb">cd</span> .. rm -rf out </code></pre></div> <p>For simplification, you can save this as <code>compile.sh</code>, execute <code>chmod +x compile.sh</code> and now you only have to enter <code>./compile.sh</code> to generate the PDF.</p> <p>Output: <div style="width: 594px" class="wp-caption aligncenter"><a href="../images/2012/07/lilypond-example.png"><img src="../images/2012/07/lilypond-example.png" alt="" width="594" height="362" class="size-full wp-image-33661"/></a><p class="wp-caption-text"></p></div></p> <h2>Further Reading</h2> <ul> <li>ABC <ul> <li><a href="http://www.tug.org/texlive/Contents/live/texmf-dist/doc/latex/abc/abc.pdf">ABC-environment Documentation</a></li> </ul> <p></li> <li>LilyPond <ul> <li><a href="http://lilypond.org/doc/v2.14/Documentation/learning/index#top">LilyPond &mdash; Learning Manual</a></li> <li><a href="http://lilypond.org/doc/v2.14/Documentation/essay.pdf">Lilypond 2.14 Documentation</a></li> <li><a href="http://createdigitalmusic.com/2010/05/lilypond-free-beautiful-music-notation-engraving-for-anyone/">Lilypond: Free, Beautiful Music Notation Engraving for Anyone</a> by Peter Kirn</li> <li><a href="http://stackoverflow.com/q/10152486/562769">Including Lilypond in LaTeX</a></li> <li><a href="http://tex.stackexchange.com/a/69804/5645">Beautiful example</a></li> </ul> </li> <li><a href="http://tex.stackexchange.com/questions/19813/creating-a-custom-songbook-with-the-songs-package">Creating a custom songbook with the songs package</a></li> <li><a href="http://homepage2.nifty.com/tonomu/score/musixtex/musixtexe.html">MusiXTeX</a></li> </ul></p> <p>If you&#39;ve made some more complex examples with LaTeX, I&#39;d be happy if you added them in the comments.</p> Die Länder der Erde http://martin-thoma.com/die-lander-der-erde Tue, 31 Jul 2012 15:00:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/die-lander-der-erde <div style="width: 482px" class="wp-caption aligncenter"><a href="../images/2012/07/laender-der-erde.png"><img src="../images/2012/07/laender-der-erde.png" alt="" width="482" height="280" class=" wp-image-35581 "/></a><p class="wp-caption-text"></p></div> <p>Hier ist ein <a href="http://www.jetpunk.com/quizzes/lander-der-welt-quiz">Spiel</a>, bei dem man die L&auml;nder der Erde eingeben muss. Es ist schon erschreckent, wie viele wei&szlig;e Flecken hier sind.</p> <h2>Punktzahl</h2> <h3>26. Juli 2012</h3> <p>You scored 54/196 = 28%. This beats or equals 21.1% of test takers. The average score is 93.</p> <p>Viele afrikanische L&auml;nder sind mir unbekannt. Habt ihr schon mal von <a href="http://de.wikipedia.org/wiki/Nauru">Nauru</a> oder <a href="http://de.wikipedia.org/wiki/Kiribati">Kiribati</a> geh&ouml;rt?</p> <h3>02. August 2012</h3> <p>You scored 90/196 = 46%. This beats or equals 67.6% of test takers. The average score is 77. Your high score is 90.</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/07/laender-der-erde-2.png"><img src="../images/2012/07/laender-der-erde-2.png" alt="" width="512" height="298" class="size-full wp-image-37601"/></a><p class="wp-caption-text"></p></div> B-Bäume http://martin-thoma.com/b-baume Fri, 27 Jul 2012 17:53:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/b-baume <p>Ein B-Baum ist eine Datenstruktur, die vor allem f&uuml;r Datenbanken (z.B. <a href="http://de.wikipedia.org/wiki/SQLite">SQLite</a>) und Dateisysteme (z.B. <a href="http://de.wikipedia.org/wiki/Ext3">ext3</a>) eingesetzt wird.</p> <p>Im Folgenden sollte man immer im Hinterkopf behalten, dass an den Schl&uuml;sseln auch Werte - sog. Satellitendaten - h&auml;ngen. Der Einfachheit halber lasse ich diese aber hier weg.</p> <h2>Definition</h2> <p>Die folgende Definition ist sinngem&auml;&szlig; aus &quot;Introduction to Algorithms&quot; von Thomas H. Cormen &uuml;bernommen.</p> <p>F&uuml;r einen <strong>B-Baum der Ordnung t</strong>, <code>$t \in \mathbb{N} \setminus \{1\}$</code>, gilt:</p> <ol> <li>Jeder Knoten `$x$` hat die folgenden Attribute: <ol> <li>`$n$`, die Anzahl der Schl&uuml;ssel die im Knoten `$x$` gespeichert wird,</li> <li>die `$n$` Schl&uuml;ssel, die in aufsteigender Reihenfolge gespeichert werden (also `$key_1 \leq key_2 \leq ... \leq key_{n}$`),</li> <li>`$isLeaf$`, ein boolscher Wert der <code>True</code> ist, falls `$x$` ein Blatt ist und <code>False</code> ist, falls `$x$` ein innerer Knoten ist</li> </ol> </li> <li>Jeder innere Knoten hat `$n + 1$` Zeiger `$c_1, c_2, ... c_{n+1}$` auf seine Kinder. Blattknoten haben keine Kinder, also sind ihre `$c_i$`-Attribute undefiniert.</li> </ol> <p>Ein Knoten eines B-Baumes sieht also so aus: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-node.png"><img src="../images/2012/07/b-tree-node.png" alt="" width="500" height="138" class="size-full wp-image-35861"/></a><p class="wp-caption-text"></p></div></p> <ol start=3> <li>Die Schl&uuml;ssel `$key_i$` setzen grenzen f&uuml;r die Werte der Schl&uuml;ssel, die in den einzelnen Subb&auml;umen gespeichert sind.<br/> Falls `$k_i$` ein Schl&uuml;ssel im Subbaum mit der Wurzel `$c_i$` ist, dann gilt: `$k_1 \leq key_1 \leq k_2 \leq key_2 \leq ... \leq key_{n} \leq k_{n} \leq key_{n+1}$`</li> <li>Alle Bl&auml;tter haben die gleiche Tiefe.</li> <li>F&uuml;r die Anzahl der Schl&uuml;ssel eines Knotens gilt: <ol> <li>Jeder Knoten (bis auf die Wurzel) hat mindestens t-1 Schl&uuml;ssel.</li> <li>Jeder Knoten hat h&ouml;chstens `$2t - 1$` Schl&uuml;ssel.</li> </ol> </li> </ol> <h2>Stolperfallen</h2> <p>Ein Schl&uuml;ssel ist etwas anderes als ein Zeiger!</p> <h2>Folgerungen</h2> <ul> <li>`$(2) \Rightarrow$` Die Wurzel hat min. 2 Kinder, falls der Baum nicht leer ist.</li> <li>`$(2), (5.1) \Rightarrow$` Jeder innere Knoten (bis auf die Wurzel) hat min. t Kinder.</li> <li>`$(2), (5.2) \Rightarrow$` Jeder innere Knoten hat maximal 2t Kinder.</li> <li>Wenn man an den Zeigern die Kinder in die Elterknoten zieht, sodass am Ende alle Knoten in der Wurzel sind, entsteht wegen (3) eine sortierte Liste.</li> <li>`$ h \leq \log_t \frac{n+1}{2}$` (Cormen, S. 489)</li> <li>Ein B-Baum hat in der Tiefe h min. `$2t^{h-1}$` Knoten.</li> </ul> <h2>Besondere B-B&auml;ume</h2> <p>Ein B-Baum der Ordnung t = 2 wird auch <a href="http://de.wikipedia.org/wiki/2-3-4-Baum">2-3-4-Baum</a> genannt, da jeder Knoten entweder 2, 3 oder 4 Kinder hat.</p> <p>Ich habe ja ausgeschlossen, dass es einen B-Baum der Ordnung t = 1 gibt. Warum eigentlich? Aus (5.1) folgt: In einem B-Baum der Ordnung t = 1 m&uuml;ssten einzelne Knoten keine Schl&uuml;ssel haben. Das ist nicht sinnvoll. Also muss <code>$t \geq 2$</code> gelten.</p> <h2>Suchen eines Schl&uuml;ssels</h2> <p>Das Suchen eines Schl&uuml;ssels funktioniert so:</p> <div class="highlight"><pre><code class="python"><span class="n">SEARCH</span><span class="o">-</span><span class="n">KEY</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="nb">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">node</span><span class="o">.</span><span class="n">n</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">key</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">key</span> <span class="o">&lt;</span> <span class="n">key</span><span class="p">:</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">key</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span> <span class="c"># Schl&amp;uuml;ssel ist gesuchter Schl&amp;uuml;ssel</span> <span class="k">return</span> <span class="n">node</span><span class="o">.</span><span class="n">key</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">satelittendaten</span> <span class="k">else</span> <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">isLeaf</span><span class="p">:</span> <span class="c"># Erfolglose Suche</span> <span class="k">return</span> <span class="n">NIL</span> <span class="k">else</span><span class="p">:</span> <span class="c"># Rekursiv weitersuchen</span> <span class="n">DISK</span><span class="o">-</span><span class="n">READ</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">return</span> <span class="n">SEARCH</span><span class="o">-</span><span class="n">KEY</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">key</span><span class="p">)</span> </code></pre></div> <p>Es wird also zuerst der Knoten durchsucht und dann gegebenenfalls der passende Subbaum.</p> <p>Laut Vorlesung (Folie 97) gilt: <ul> <li>Anzahl Zugriffe auf Hintergrundspeicher maximal: <code>${\cal O}(\log_t(n))$</code></li> <li>Innerhalb eines Knotens: <code>${\cal O}(t)$</code></li> <li>Insgesamt also: <code>${\cal O}(t \cdot \log_t(n))$</code></li> </ul></p> <h2>Einf&uuml;gen von Schl&uuml;sseln</h2> <p>Wenn ein Schl&uuml;ssel in einen B-Baum eingef&uuml;gt werden soll, dann muss man insebesondere auf Regel (5.1) und (5.2) achten: Jeder Knoten enth&auml;lt n Schl&uuml;ssel, mit <code>$t-1 \leq n \leq 2t -1$</code>.</p> <p>Die Idee ist, dass man das Blatt sucht, in dem der Schl&uuml;ssel sein m&uuml;sste. Falls noch Platz ist, kann man den Schl&uuml;ssel einfach einf&uuml;gen. Falls nicht, muss man das Blatt aufsplitten.</p> <h3>Beispiel zu Fall 1: Es ist noch Platz</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-2-small.png"><img src="../images/2012/07/b-tree-2-small.png" alt="" width="500" height="217" class="size-full wp-image-36091"/></a><p class="wp-caption-text"></p></div> <p>In den B-Baum aus Abb. 2 soll nun der Schl&uuml;ssel <code>16</code> eingef&uuml;gt werden. In einem B-Baum der Ordnung 2 hat jeder Knoten mindestens einen und h&ouml;chstens 3 Schl&uuml;ssel. Egal wo wir also landen w&uuml;rden, es w&uuml;rde noch in diesen Baum passen. Wir landen aber im Knoten rechts unten, da <code>$11 &lt; 16$</code> ist.</p> <p>Das Ergebnis ist also: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-2-small-2.png"><img src="../images/2012/07/b-tree-2-small-2.png" alt="" width="500" height="195" class="size-full wp-image-36111"/></a><p class="wp-caption-text"></p></div></p> <h3>Beispiel zu Fall 2: Knoten&uuml;berlauf</h3> <p>Will man nun in den B-Baum der Ordnung 2 aus Abb. 3 den Schl&uuml;ssel 17 hinzuf&uuml;gen, so gibt es einen &quot;Knoten&uuml;berlauf&quot;. Der Schl&uuml;ssel m&uuml;sste in den Knoten rechts unten. Damit h&auml;tte dieser 4 Schl&uuml;ssel, er darf aber nur 3 haben. Also splitten wir zuerst den Knoten. Schl&uuml;ssel 15 wandert zu dem Elternknoten hoch, die beiden einzelnen Schl&uuml;ssel bilden eigene Knoten. Damit man sieht, was mit den Schl&uuml;sseln geschehen w&uuml;rde, wenn der Baum gr&ouml;&szlig;er w&auml;re, habe ich diese mal eingef&auml;rbt: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-2-small-3.png"><img src="../images/2012/07/b-tree-2-small-3.png" alt="" width="500" height="195" class="size-full wp-image-36131"/></a><p class="wp-caption-text"></p></div></p> <p>Nun ist man beim Einf&uuml;gen von 17 wieder in Fall 1. Das Ergebnis sieht so aus: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-2-small-4.png"><img src="../images/2012/07/b-tree-2-small-4.png" alt="" width="500" height="176" class="size-full wp-image-36151"/></a><p class="wp-caption-text"></p></div></p> <p>Nat&uuml;rlich kann es auch passieren, dass beim hochwandern des mittleren Knoten (15 von Abb. 3 nach Abb. 4) der Elternknoten &uuml;berl&auml;uft. Dann muss halt auch dieser gesplittet werden. Wenn die Wurzel &uuml;berl&auml;uft, muss eine neue Wurzel erstellt werden. Dann kann die alte Wurzel gesplittet werden.</p> <p>Die Laufzeit des Einf&uuml;gens ist in <code>${\cal O}(t \cdot \log_t(n))$</code>.</p> <h2>L&ouml;schen eines Schl&uuml;ssels</h2> <p>Falls sich der Schl&uuml;ssel in einem Blatt befindet, kann man ihn einfach l&ouml;schen. Allerdings muss man darauf achten, dass mindestens t-1 Schl&uuml;ssel im Knoten verbleiben.</p> <p>Ist der Schl&uuml;ssel in einem inneren Knoten ist das ganze schwerer.</p> <h3>Fall 1: Schl&uuml;ssel in Blatt</h3> <p>Der Einfachste Fall ist der <a href="#Beispiel_zu_Fall_1_Es_ist_noch_Platz">1. Fall des Einf&uuml;gens</a>, nur umgekehrt. Also aus dem B-Baum aus Abb. 3 die 16 entfernen. Dann entsteht der B-Baum aus Abb. 2.</p> <h3>Fall 2 - 3</h3> <p>F&uuml;r die anderen F&auml;lle habe ich leider kein kleines Beispiel und will deshalb auf die Erkl&auml;rung verzichten. </p> <p>Falls ihr da Hilfe braucht: Cormen, dritte Ausgabe, S. 499ff war sehr hilfreich. (<a href="http://shafaetsplanet.com/uploads/pdf/Introduction%20to%20Algorithms.pdf">Link</a> - Warum auch immer der eine PDF-Datei vom Buch hat. Die KIT-Bibliothek hat leider keine Online-Version.)</p> <h2>Trivia</h2> <blockquote>[...] standard B-trees had numerous characteristics that were at odds with the ext2 design philosophy of simplicity and robustness. For example, XFS's B-tree implementation was larger than all of ext2 or ext3's source files combined.</blockquote> <p>Source: <a href="http://ext2.sourceforge.net/2005-ols/paper-html/node3.html">ext2.sourceforge.net</a></p> <h2>Beispiel</h2> <p>F&uuml;gt man die Schl&uuml;ssel 2, 4, 6, 8, 10, 12 in einen anfangs leeren B-Baum ein, entwickelt sich dieser wie folgt:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-3-evolution.png"><img src="../images/2012/07/b-tree-3-evolution.png" alt="" width="500" height="292" class="size-full wp-image-36421"/></a><p class="wp-caption-text"></p></div> <p>Die grauen Felder sind f&uuml;r Zeiger reserviert. Ist kein Zeiger eingezeichnet, dann ist es ein NIL-Zeiger.</p> <h2>Siehe auch</h2> <ul> <li><a href="http://stackoverflow.com/questions/11684578/which-datastructure-do-nodes-of-b-trees-use">Which datastructure do nodes of B-Trees use?</a></li> <li><a href="http://stackoverflow.com/questions/32376/what-is-a-good-open-source-b-tree-implementation-in-c">What is a good open source B-tree implementation in C?</a> - Da kann man mal sehen wie es wirklich funktioniert :-)</li> <li><a href="http://stackoverflow.com/a/6403383/562769">Red Black Tree vs. B Tree</a></li> <li><a href="http://stackoverflow.com/a/1589587/562769">When to choose RB tree, B-Tree or AVL tree?</a></li> </ul> Die Landau-Symbole http://martin-thoma.com/die-landau-symbole Thu, 26 Jul 2012 06:41:08 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/die-landau-symbole <h2>Definitionen</h2> <p><code>$ \begin{eqnarray*} {\cal O}(g(n)) &amp;:= \{f(n) | \exists_{c &gt; 0} \exists_{n_0 &gt; 0} \forall_{n \geq n_0}: f(n) &lt; c \cdot g(n) \} \\ {\cal o}(g(n)) &amp;:= \{f(n) | \forall_{c &gt; 0} \exists_{n_0 &gt; 0} \forall_{n \geq n_0}: f(n) &lt; c \cdot g(n) \} \\ \Omega (g(n)) &amp;:= \{f(n) | \exists_{c &gt; 0} \exists_{n_0 &gt; 0} \forall_{n \geq n_0}: f(n) &gt; c \cdot g(n) \} \\ \omega (g(n)) &amp;:= \{f(n) | \forall_{c &gt; 0} \exists_{n_0 &gt; 0} \forall_{n \geq n_0}: f(n) &gt; c \cdot g(n) \} \\ \end{eqnarray*} $</code> <code>$\Theta (g(n)) := \{f(n) | \exists_{c_0 &gt; 0} \exists_{c_1 &gt; 0} \exists_{n_0 &gt; 0} \forall_{n &gt; n_0}: c_0 \cdot g(n) &lt; f(n) &lt; c_1 \cdot g(n) \}$</code></p> <h2>Wichtige Aussagen der Mengen</h2> <p><code>$\begin{align} f(n) \in {\cal O}(g(n)) &amp;\Leftrightarrow g(n) \in \Omega(f(n)) \\ f(n) \in {\cal o}(g(n)) &amp;\Leftrightarrow g(n) \in \omega(f(n)) \\ f(n) \in {\cal O}(g(n)) \land f(n) \in \Omega(g(n)) &amp;\Leftrightarrow f(n) \in \Theta(g(n)) \\ f(n) \in o(g(n)) &amp;\Leftrightarrow \lim \frac{f(n)}{g(n)} = 0 \\ f(n) \in \Theta ( g(n)) &amp;\Leftrightarrow g(n) \in \Theta(f(n)) \\ f(n) \in \omega(g(n)) &amp;\Leftrightarrow \lim \frac{g(n)}{f(n)} = 0 \end{align}$</code> </p> <h2>Logarithmusgesetze</h2> <p><code>$ \begin{align} \log(x \cdot y) &amp;= \log(x) + \log(y) \\ \log(\frac{x}{y}) &amp;= \log(x) &amp;ndash; \log(y) \\ \log(x^r) &amp;= r \cdot \log(x) \end{align}$</code></p> <h2>Wichtige Beziehungen von Funktionen</h2> <p><code>${\cal O}(1) \subsetneq {\cal O}(\log n) \subsetneq {\cal O}(n) \subsetneq {\cal O}(n^{2.1}) \subsetneq {\cal O} \subsetneq (n^{2.2}) {\cal O}(n^{100}) \subsetneq {\cal O}(n!) \subsetneq {\cal O}(2^n)$</code> <code>${\cal O}(2^n) \subsetneq {\cal O}(2^{2n}) \subsetneq {\cal O}(3^n) \subsetneq {\cal O}(n^n) \subsetneq {\cal O}(n^{(n^2)}) \subsetneq$</code></p> <h2>Beispiele</h2> <p>Im Folgenden gelte immer: <code>$f: \mathbb{N} \rightarrow \mathbb{R^+}$</code> und <code>$g:\mathbb{N} \rightarrow \mathbb{R^+}$</code></p> <h3>Nummer 1</h3> <p><strong>Voraussetzungen</strong>: Sei <code>$f(n) := \sqrt{2}^{\lg(n)}$</code> und <code>$g(n) := n \cdot \lg(n)$</code>. <strong>Behauptung</strong>: <code>$f \in {\cal O}(g(n))$</code> <strong>Beweis</strong>: <code>$f(n) = \sqrt{2}^{\lg(n)} = 10^{\lg(\sqrt{2}^{\lg(n)})} = 10^{\lg(\sqrt{2}) \cdot \lg(n)} = n^{\lg(\sqrt{2})}= n^{\frac{1}{2} \cdot \lg(2)} &lt; n^1 = n$</code></p> <p>Es gilt: <code>$n \in {\cal O}(n \cdot \lg(n)) = {\cal O}(g(n))$</code> <code>$\Rightarrow f(n) \in {\cal O}(g(n)) \blacksquare$</code></p> <h3>Nummber 2</h3> <p><strong>Voraussetzungen</strong>: Sei <code>$f(n) := \sqrt{5}^{\log_3(n)}$</code> und <code>$g(n) := n^2$</code>. <strong>Behauptung</strong>: <code>$f \in {\cal o}(g(n))$</code> <strong>Beweis</strong>: <code>$f(n) = \sqrt{5}^{\log_3(n)} = 3^{\log_3(\sqrt{5}^{\log_3(n)})} = 3^{\log_3(5) \cdot \log_3(n)} = n^{\log_3(5)} &lt; n^{\log_3(9)} = n^{\log_3(3^2)} = n^2$</code></p> <p>Sei <code>$\varepsilon &gt; 0$</code>. Dann gilt: <code>$n^{2- \varepsilon} \in o(n^2) \Rightarrow f(n) \in o(g(n)) \blacksquare$</code></p> Plotting graphs with PGFplots (LaTeX and Tikz) http://martin-thoma.com/plotting-graphs-with-pgfplots-latex-and-tikz Tue, 24 Jul 2012 15:00:28 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/plotting-graphs-with-pgfplots-latex-and-tikz <p>I guess many of you might need to plot functions or data once. So I&#39;ve made one example that shows much of the features you might need: <ul> <li>You can see how to change the axis&#39; from normal linear scale to logarithmic scale.</li> <li>Some axis-manipulations were used.</li> <li>I have used a CSV-file to import and plot data.</li> <li>The red line was drawn with a mathematical function.</li> </ul></p> <p>Best of all: I didn&#39;t use anything which is not in LaTeX :-) (Well, the generation of the CSV-file doesn&#39;t count. I just wanted to include such an example for physicists who might need to plot results of experiments).</p> <p>The complete source is in the <a href='../images/2012/07/birthday-paradox.zip'>Birthday Paradox Archive</a>.</p> <h2>Result</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/birthday-paradox.png"><img src="../images/2012/07/birthday-paradox.png" alt="" width="500" height="264" class="size-full wp-image-34821"/></a><p class="wp-caption-text"></p></div> <h2>LaTeX-Code</h2> <p>The following LaTeX-Code used TikZ and PGFplots: ```latex % Plot of the probability that two people out of n people have the % same birthday. % Author: Martin Thoma % Source: ../plotting-graphs-with-pgfplots/</p> <p>\documentclass{article} \usepackage[pdftex,active,tightpage]{preview} \setlength\PreviewBorder{2mm}</p> <p>\usepackage{pgfplots} \usepackage{tikz} \usetikzlibrary{arrows, positioning, calc}</p> <p>\begin{document} \begin{preview} \begin{tikzpicture} \begin{axis}[ width=15cm, height=8cm, % size of the image grid = major, grid style={dashed, gray!30}, %xmode=log,log basis x=10, %ymode=log,log basis y=10, xmin=0, % start the diagram at this x-coordinate xmax=62, % end the diagram at this x-coordinate ymin=0, % start the diagram at this y-coordinate ymax=1.1, % end the diagram at this y-coordinate /pgfplots/xtick={0,5,...,60}, % make steps of length 5 extra x ticks={23}, extra y ticks={0.507297}, axis background/.style={fill=white}, ylabel=probability of at least one birthday-collision, xlabel=people, tick align=outside]</p> <div class="highlight"><pre><code class="text language-text" data-lang="text"> % import the correct data from a CSV file \addplot table [id=exp]{data.csv}; % mark x=23 \coordinate (a) at (axis cs:23,0.507297); \draw[blue, dashed, thick](a -| current plot begin) -- (a); \draw[blue, dashed, thick](a |- current plot begin) -- (a); % plot the stirling-formulae \addplot[domain=0:60, red, thick] {1-(365/(365-x))^(365.5-x)*e^(-x)}; \end{axis} </code></pre></div> <p>\end{tikzpicture} \end{preview} \end{document} ```</p> <p>I generate the images directly with this Makefile: ```basemake SOURCE = birthday-paradox DELAY = 80 DENSITY = 300 WIDTH = 500</p> <p>make: pdflatex `$(SOURCE).tex -output-format=pdf make clean</p> <p>clean: rm -rf $`(TARGET) *.class *.html *.log *.aux</p> <p>gif: pdfcrop <code>$(SOURCE).pdf convert -verbose -delay $</code>(DELAY) -loop 0 -density <code>$(DENSITY) $</code>(SOURCE)-crop.pdf `$(SOURCE).gif make clean</p> <p>png: make make svg inkscape $<code>(SOURCE).svg -w</code>$(WIDTH) --export-png=$`(SOURCE).png</p> <p>transparentGif: convert `$(SOURCE).pdf -transparent white result.gif make clean</p> <p>svg: #inkscape $<code>(SOURCE).pdf --export-plain-svg=</code>$(SOURCE).svg pdf2svg $<code>(SOURCE).pdf</code>$(SOURCE).svg # Necessary, as pdf2svg does not always create valid svgs: inkscape $<code>(SOURCE).svg --export-plain-svg=$(SOURCE).svg </code>``</p> <h2>See also</h2> <ul> <li><a href="../plotting-function-graphs-with-latex/">Plotting function graphs with LaTeX</a></li> <li><a href="http://www.texample.net/tikz/examples/tag/plots/">Plotting examples</a></li> <li><a href="http://www.texample.net/tikz/examples/area/mathematics/">Mathematics examples</a></li> <li><a href="http://tex.stackexchange.com/questions/tagged/pgfplots?sort=votes">tex.stackexchange.com</a></li> </ul> Why to study math? http://martin-thoma.com/why-to-study-math Sun, 22 Jul 2012 23:14:24 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/why-to-study-math <iframe width="512" height="288" src="http://www.youtube.com/embed/aYIv4jggQJc" frameborder="0" allowfullscreen></iframe> <h2>Math is beautiful</h2> <p>See also: <ul> <li><a href="http://www.youtube.com/watch?v=I1UzGC15sBI&feature=youtu.be&t=3m18s">Different sizes of infinity</a></li> <li><a href="http://youtu.be/ud-GOdM255c">Beauty in Maths: math animation no.7</a> - 5D Visualization of three equations</li> </ul></p> <h2>Math is important</h2> <p>If you are interested in natural science, you will defenitely need math. Here are a few examples where math is directly needed:</p> <ul> <li><strong>Computer Science</strong>: All kinds of animations, stochastics is needed often, cryptography needs number theory</li> <li><strong>Physics</strong>: a lot of analysis seems to be needed, differential equations are used if processes are depend on time</li> <li><strong>Chemistry</strong>, <strong>Biology</strong>, <strong>Medicine</strong>, <strong>Psychology</strong>: again stochastics for interpreting results of experiments</li> <li><strong>economic science</strong>: modelling - I don't know anything about economic science, but I've heard they need differential equations</li> </ul> <p>Although I guess you could continue this list, but the most important reason is that it teaches you how to think logically.</p> <h2>Jobs are better</h2> <div style="width: 395px" class="wp-caption aligncenter"><a href="../images/2012/07/reddit-math-degree.png"><img src="../images/2012/07/reddit-math-degree.png" alt="" width="395" height="398" class="size-full wp-image-34701"/></a><p class="wp-caption-text"></p></div> <h2>Math is worth a lot of money</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/BbX44YSsQ2I" frameborder="0" allowfullscreen></iframe> <h2>Math is fun</h2> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/07/topologist-cup.jpg"><img src="../images/2012/07/topologist-cup.jpg" alt="" width="400" height="300" class="size-full wp-image-34721"/></a><p class="wp-caption-text"></p></div> <div style="width: 640px" class="wp-caption aligncenter"><a href="../images/2012/07/456-top-10-signs-you-are-a-mathematician.png"><img src="../images/2012/07/456-top-10-signs-you-are-a-mathematician.png" alt="" width="640" height="303" class="size-full wp-image-34741"/></a><p class="wp-caption-text"></p></div> <iframe width="512" height="288" src="http://www.youtube.com/embed/mpITo-RN-bY" frameborder="0" allowfullscreen></iframe> Übersicht über Datenstrukturen http://martin-thoma.com/ubersicht-uber-datenstrukturen Sun, 22 Jul 2012 15:38:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ubersicht-uber-datenstrukturen <p>Diese &Uuml;bersicht beinhaltet grundlegende Datenstrukturen. Es gibt weitaus <a href="http://de.wikipedia.org/wiki/Kategorie:Datenstruktur">mehr Datenstrukturen</a> (z.B. <a href="http://de.wikipedia.org/wiki/Bloomfilter">Bloomfilter</a>), als ich hier erw&auml;hne. Diese Datenstrukturen wurden in der Vorlesung Algorithmen I bei Frau Zitterbart am KIT erkl&auml;rt.</p> <h2>Array</h2> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/array.png"><img src="../images/2012/07/array.png" alt="" width="500" height="225" class="size-full wp-image-34531"/></a><p class="wp-caption-text"></p></div> <p>Ein Array, auch <a href="http://de.wikipedia.org/wiki/Feld_(Datentyp)">Feld</a> genannt, ist eine Datenstruktur. Charakteristika: <ul> <li>Ein Array hat eine feste, nicht ver&auml;nderbare Gr&ouml;&szlig;e.</li> <li>Der Zugriff auf jedes beliebige Element erfolgt in konstanter Zeit - ist also insbesondere unabh&auml;ngig von der Gr&ouml;&szlig;e!</li> </ul></p> <h2>Dynamische Arrays</h2> <p>Dynamische Arrays sind wie normale Arrays, nur dass sie wachsen k&ouml;nnen. Sobald ein Element eingef&uuml;gt werden soll, dass nicht mehr ins Array passen w&uuml;rde, allokiert man ein doppelt so gro&szlig;es Array und kopiert die Elemente um.</p> <p>In Java ist es ein <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html">Vector</a> bzw. eine <a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html">ArrayList</a>, in <a href="../vectors-in-cpp/" title="Vectors in C++">C++ Vektoren</a>.</p> <h2>Hashtabelle</h2> <blockquote>In der Informatik bezeichnet man eine spezielle Indexstruktur als Hashtabelle (englisch hash table oder hash map) bzw. Streuwerttabelle. Als Indexstruktur werden Hashtabellen verwendet um Datenelemente in einer gro&szlig;en Datenmenge aufzufinden. Zu Hashtabellen alternative Index-Datenstrukturen sind beispielsweise Baumstrukturen (wie etwa ein B+-Baum) und die Skip-List. Hashtabellen zeichnen sich durch einen &uuml;blicherweise konstanten Zeitaufwand bei Einf&uuml;ge- bzw. Entfernen-Operationen aus. Beim Einsatz einer Hashtabelle zur Suche in Datenmengen spricht man auch von einem Hashverfahren oder Streuspeicherverfahren.</blockquote> <p>Quelle: <a href="http://de.wikipedia.org/wiki/Hashtabelle">Hashtabelle</a></p> <p>Hashtabellen werden hier benutzt: <ul> <li>Python 3.2.3: Modules/_pickle.c</li> <li>Java OpenJDK 7: <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html">java.util.HashTable</a> und sehr viele mehr benutzen es (Properties.java, Dictionary.java, Enum.java, ...)</li> </ul></p> <p>Sie garantieren eine amortisierte Laufzeit von <code>${\cal O}(1)$</code> f&uuml;r Suchen, L&ouml;schen und Einf&uuml;gen.</p> <p>Folgende Begriffe sollte man kennen: <ul> <li><a href="http://de.wikipedia.org/wiki/Divisionsrestmethode">Divisions-Rest-Methode</a>: <code>$h(k) = k \mod m$</code></li> <li><a href="http://de.wikipedia.org/wiki/Multiplikative_Methode">Multiplikationsmethode</a>: <code>$h(k) = \lfloor A \cdot k \mod 1 \rfloor$</code>, mit z.B. <code>$A \approx \frac{\sqrt{5}-1}{2}$</code></li> <li>offenes Hashing</li> <li><a href="http://de.wikipedia.org/wiki/Doppel-Hashing">Doppeltes Hashing</a>: <code>$h(k, i) = (h_1(k) + i \cdot h_2(k)) \mod m$</code></li> <li><a href="http://de.wikipedia.org/wiki/Hashtabelle#Lineares_Sondieren">Lineares und quadratische Sondieren</a></li> <li>Belegungsfaktor: <code>$\alpha = \frac{\text{Anzahl gespeicherter Elemente}}{\text{Anzahl der Slots}}$</code></li> <li>Prim&auml;re und sekund&auml;re Clusterbildung</li> </ul></p> <h2>Stack</h2> <div style="width: 101px" class="wp-caption alignright"><a href="../images/2012/07/stack-101x300.png"><img src="../images/2012/07/stack-101x300.png" alt="" width="101" height="300" class="size-medium wp-image-34421"/></a><p class="wp-caption-text"></p></div> <p>Stacks, auch &quot;<a href="http://de.wikipedia.org/wiki/Stapelspeicher">Stapelspeicher</a>&quot; oder &quot;Kellerspeicher&quot; genannt, sind eine elementare Datenstruktur. Es sollte sie in jeder Sprache geben. In Java ist es in <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html">java.util.Stack</a>, in Python sind es <a href="http://docs.python.org/tutorial/datastructures.html#using-lists-as-stacks">Listen</a> und nat&uuml;rlich gibt es auch in <a href="../stacks-in-cpp/" title="Stacks in C++">C++ Stacks</a>.</p> <p>Wie man am Bild sehr sch&ouml;n sehen kann, definiert ein Stack keine Ordnung &uuml;ber die Elemente. Wenn ein neues Element kommt, wird es auf den Stack gelegt. Man kann auch nur das oberste Element - in diesem Fall a - vom Stack nehmen. Deshalb werden Stacks auch als LIFO-Speicher (<em>L</em>ast <em>I</em>n <em>F</em>irst <em>O</em>ut) bezeichnet.</p> <p>Stacks werden mit dynamischen Arrays realisiert. Dazu mal ein kleines Beispiel:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.Stack</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">Stack</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">s</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Stack</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">s</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">12</span><span class="o">);</span> <span class="n">s</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="mi">13</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="n">s</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">i</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">&quot;size: %d \t capacity: %d\n&quot;</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="na">size</span><span class="o">(),</span> <span class="n">s</span><span class="o">.</span><span class="na">capacity</span><span class="o">());</span> <span class="o">}</span> <span class="k">while</span> <span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span> <span class="s">&quot;Element: %d \t size: %d \t capacity: %d\n&quot;</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="na">pop</span><span class="o">(),</span><span class="n">s</span><span class="o">.</span><span class="na">size</span><span class="o">(),</span> <span class="n">s</span><span class="o">.</span><span class="na">capacity</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Ausgabe:</p> <div class="highlight"><pre><code class="bash">size: 3 capacity: 10 size: 4 capacity: 10 size: 5 capacity: 10 size: 6 capacity: 10 size: 7 capacity: 10 size: 8 capacity: 10 size: 9 capacity: 10 size: 10 capacity: 10 size: 11 capacity: 20 size: 12 capacity: 20 size: 13 capacity: 20 size: 14 capacity: 20 size: 15 capacity: 20 size: 16 capacity: 20 size: 17 capacity: 20 size: 18 capacity: 20 size: 19 capacity: 20 size: 20 capacity: 20 size: 21 capacity: 40 size: 22 capacity: 40 size: 23 capacity: 40 size: 24 capacity: 40 size: 25 capacity: 40 size: 26 capacity: 40 size: 27 capacity: 40 size: 28 capacity: 40 size: 29 capacity: 40 size: 30 capacity: 40 size: 31 capacity: 40 size: 32 capacity: 40 size: 33 capacity: 40 size: 34 capacity: 40 size: 35 capacity: 40 size: 36 capacity: 40 size: 37 capacity: 40 size: 38 capacity: 40 size: 39 capacity: 40 size: 40 capacity: 40 size: 41 capacity: 80 size: 42 capacity: 80 size: 43 capacity: 80 size: 44 capacity: 80 size: 45 capacity: 80 size: 46 capacity: 80 size: 47 capacity: 80 size: 48 capacity: 80 size: 49 capacity: 80 size: 50 capacity: 80 size: 51 capacity: 80 size: 52 capacity: 80 size: 53 capacity: 80 size: 54 capacity: 80 size: 55 capacity: 80 size: 56 capacity: 80 size: 57 capacity: 80 size: 58 capacity: 80 size: 59 capacity: 80 size: 60 capacity: 80 size: 61 capacity: 80 size: 62 capacity: 80 size: 63 capacity: 80 size: 64 capacity: 80 size: 65 capacity: 80 size: 66 capacity: 80 size: 67 capacity: 80 size: 68 capacity: 80 size: 69 capacity: 80 size: 70 capacity: 80 size: 71 capacity: 80 size: 72 capacity: 80 size: 73 capacity: 80 size: 74 capacity: 80 size: 75 capacity: 80 size: 76 capacity: 80 size: 77 capacity: 80 size: 78 capacity: 80 size: 79 capacity: 80 size: 80 capacity: 80 size: 81 capacity: 160 size: 82 capacity: 160 size: 83 capacity: 160 size: 84 capacity: 160 size: 85 capacity: 160 size: 86 capacity: 160 size: 87 capacity: 160 size: 88 capacity: 160 size: 89 capacity: 160 size: 90 capacity: 160 size: 91 capacity: 160 size: 92 capacity: 160 size: 93 capacity: 160 size: 94 capacity: 160 size: 95 capacity: 160 size: 96 capacity: 160 size: 97 capacity: 160 size: 98 capacity: 160 size: 99 capacity: 160 size: 100 capacity: 160 size: 101 capacity: 160 size: 102 capacity: 160 Element: 99 size: 101 capacity: 160 Element: 98 size: 100 capacity: 160 Element: 97 size: 99 capacity: 160 Element: 96 size: 98 capacity: 160 Element: 95 size: 97 capacity: 160 Element: 94 size: 96 capacity: 160 Element: 93 size: 95 capacity: 160 Element: 92 size: 94 capacity: 160 Element: 91 size: 93 capacity: 160 Element: 90 size: 92 capacity: 160 Element: 89 size: 91 capacity: 160 Element: 88 size: 90 capacity: 160 Element: 87 size: 89 capacity: 160 Element: 86 size: 88 capacity: 160 Element: 85 size: 87 capacity: 160 Element: 84 size: 86 capacity: 160 Element: 83 size: 85 capacity: 160 Element: 82 size: 84 capacity: 160 Element: 81 size: 83 capacity: 160 Element: 80 size: 82 capacity: 160 Element: 79 size: 81 capacity: 160 Element: 78 size: 80 capacity: 160 Element: 77 size: 79 capacity: 160 Element: 76 size: 78 capacity: 160 Element: 75 size: 77 capacity: 160 Element: 74 size: 76 capacity: 160 Element: 73 size: 75 capacity: 160 Element: 72 size: 74 capacity: 160 Element: 71 size: 73 capacity: 160 Element: 70 size: 72 capacity: 160 Element: 69 size: 71 capacity: 160 Element: 68 size: 70 capacity: 160 Element: 67 size: 69 capacity: 160 Element: 66 size: 68 capacity: 160 Element: 65 size: 67 capacity: 160 Element: 64 size: 66 capacity: 160 Element: 63 size: 65 capacity: 160 Element: 62 size: 64 capacity: 160 Element: 61 size: 63 capacity: 160 Element: 60 size: 62 capacity: 160 Element: 59 size: 61 capacity: 160 Element: 58 size: 60 capacity: 160 Element: 57 size: 59 capacity: 160 Element: 56 size: 58 capacity: 160 Element: 55 size: 57 capacity: 160 Element: 54 size: 56 capacity: 160 Element: 53 size: 55 capacity: 160 Element: 52 size: 54 capacity: 160 Element: 51 size: 53 capacity: 160 Element: 50 size: 52 capacity: 160 Element: 49 size: 51 capacity: 160 Element: 48 size: 50 capacity: 160 Element: 47 size: 49 capacity: 160 Element: 46 size: 48 capacity: 160 Element: 45 size: 47 capacity: 160 Element: 44 size: 46 capacity: 160 Element: 43 size: 45 capacity: 160 Element: 42 size: 44 capacity: 160 Element: 41 size: 43 capacity: 160 Element: 40 size: 42 capacity: 160 Element: 39 size: 41 capacity: 160 Element: 38 size: 40 capacity: 160 Element: 37 size: 39 capacity: 160 Element: 36 size: 38 capacity: 160 Element: 35 size: 37 capacity: 160 Element: 34 size: 36 capacity: 160 Element: 33 size: 35 capacity: 160 Element: 32 size: 34 capacity: 160 Element: 31 size: 33 capacity: 160 Element: 30 size: 32 capacity: 160 Element: 29 size: 31 capacity: 160 Element: 28 size: 30 capacity: 160 Element: 27 size: 29 capacity: 160 Element: 26 size: 28 capacity: 160 Element: 25 size: 27 capacity: 160 Element: 24 size: 26 capacity: 160 Element: 23 size: 25 capacity: 160 Element: 22 size: 24 capacity: 160 Element: 21 size: 23 capacity: 160 Element: 20 size: 22 capacity: 160 Element: 19 size: 21 capacity: 160 Element: 18 size: 20 capacity: 160 Element: 17 size: 19 capacity: 160 Element: 16 size: 18 capacity: 160 Element: 15 size: 17 capacity: 160 Element: 14 size: 16 capacity: 160 Element: 13 size: 15 capacity: 160 Element: 12 size: 14 capacity: 160 Element: 11 size: 13 capacity: 160 Element: 10 size: 12 capacity: 160 Element: 9 size: 11 capacity: 160 Element: 8 size: 10 capacity: 160 Element: 7 size: 9 capacity: 160 Element: 6 size: 8 capacity: 160 Element: 5 size: 7 capacity: 160 Element: 4 size: 6 capacity: 160 Element: 3 size: 5 capacity: 160 Element: 2 size: 4 capacity: 160 Element: 1 size: 3 capacity: 160 Element: 0 size: 2 capacity: 160 Element: 13 size: 1 capacity: 160 Element: 12 size: 0 capacity: 160 </code></pre></div> <p>Wenn man das ausf&uuml;hrt, sieht man es recht schnell. Alternativ schaut man in die Dokumentation und liest: <blockquote>The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack.</blockquote></p> <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Push</td> <td>`${\cal O}(1)$`</td> <td>Ein Element auf den Stack legen</td> </tr> <tr> <td>Pop</td> <td>`${\cal O}(1)$`</td> <td>Das oberste Element von der Liste nehmen</td> </tr> </table> <p>Ein Stack l&auml;sst sich als doppelt verkettete, zyklische Liste implementieren.</p> <h2>Warteschlangen</h2> <p>Warteschlangen, auch Queues genannt, sind Stacks sehr &auml;hnlich. Beide unterst&uuml;tzen prinzipiell nur zwei Operationen. Bei Stacks nanne es sich PUSH und POP, bei Warteschlangen hei&szlig;t es ENQUEUE und DEQUEUE. Im Unterschied zum Stack wird bei der Warteschlange das Element nicht von oben wieder weggenommen, sondern von hinten. Das Bild einer Warteschlange ist hier sehr passend.</p> <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Enqueue</td> <td>`${\cal O}(1)$`</td> <td>Ein Element auf den Stack legen</td> </tr> <tr> <td>Dequeue</td> <td>`${\cal O}(1)$`</td> <td>Das oberste Element von der Liste nehmen</td> </tr> </table> <p>Eine Warteschlange l&auml;sst sich als doppelt verkettete, zyklische Liste implementieren.</p> <h2>Verkettete Listen</h2> <p>Wie bei allen Datenstrukturen, kann man f&uuml;r verkettete Listen mehr Operationen definieren und umsetzen, als ich hier aufliste. Eine gute Menge von Operationen wird durch das <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html">Java List Interface</a> vorgegeben.</p> <h3>Einfach verkettete Liste</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/singly-linked-list.png"><img src="../images/2012/07/singly-linked-list.png" alt="" width="500" height="71" class="size-full wp-image-34051"/></a><p class="wp-caption-text"></p></div> <p>Sei <code>$n$</code> die Anzahl der Elemente der Liste. <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Minimum</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Maximum</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Einf&uuml;gen am Anfang</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> <tr> <td>Wahlfreies Einf&uuml;gen</td> <td><code>${\cal O}(n)$</code></td> <td></td> </tr> <tr> <td>L&ouml;schen</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Suchen</td> </tr> <tr> <td>Vorg&auml;nger</td> <td><code>${\cal O}(n)$</code></td> <td></td> </tr> <tr> <td>Nachfolger</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> </table></p> <h3>Doppelt verkettete Liste</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/doubly-linked-list.png"><img src="../images/2012/07/doubly-linked-list.png" alt="" width="500" height="54" class="size-full wp-image-34031"/></a><p class="wp-caption-text"></p></div> <p>Sei <code>$n$</code> die Anzahl der Elemente der Liste. <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Minimum</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Maximum</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Element ist am Ende der Liste</td> </tr> <tr> <td>Einf&uuml;gen am Anfang</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> <tr> <td>Wahlfreies Einf&uuml;gen</td> <td><code>${\cal O}(n)$</code></td> <td></td> </tr> <tr> <td>L&ouml;schen</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Suchen</td> </tr> <tr> <td>Vorg&auml;nger</td> <td><code>${\cal O}(1)$</code></td> <td>Nur hier ist die doppelt-verkettete Liste besser als die einfach verkettete Liste.</td> </tr> <tr> <td>Nachfolger</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> </table></p> <h2>B&auml;ume</h2> <p>In der Vorlesung wurden B&auml;ume sehr unpr&auml;zise eingef&uuml;hrt. Ich versuche das mal etwas pr&auml;ziser zu machen: <div class="definition">Sei <code>$G = (V, E)$</code> ein gerichteter Graph. <code>$G$</code> hei&szlig;t <strong>gerichteter Baum</strong> <code>$: \Leftrightarrow \exists_{r \in V} \forall_{x \in V}:$</code>Es exisitert genau ein Pfad von <code>$r$</code> nach <code>$x$</code>.</div></p> <div class="definition">Sei `$G = (V, E)$` ein gerichteter Baum und sei `$r \in V$` das `$r$` aus der Definition. `$r$` hei&szlig;t <strong>Wurzel</strong> von `$G$`.</div> <p>ACHTUNG: Die folgende Definition habe ich mir ausgedacht! NICHT IN DER KLAUSUR VERWENDEN! <div class="definition">Sei <code>$E \subseteq V \times V$</code> eine Menge ungerichteter Kanten. Dann bezeichne <code>$G(E) := \{(v, w) | \{v, w\} \in E\}$</code> die Menge aller zugeh&ouml;rigen gerichteten Kanten.</div></p> <div class="definition">Sei `$U = (V, E)$` ein ungerichteter Graph. `$U$` hei&szlig;t ein <strong>ungerichteter Baum</strong> `$:\Leftrightarrow \exists$` gerichteten Baum `$G = (V, E')$` mit `$E' \subsetneq G(E)$`.</div> <div class="definition">Sei `$G = (V, E)$` ein Baum und `$x, y \in V$`. `$x$` hei&szlig;t <strong>Elternknoten</strong> von `$y :\Leftrightarrow x$` liegt auf dem Pfad von der Wurzel nach `$y$` direkt vor `$y$`.</div> <div class="definition">Sei `$G = (V, E)$` ein Baum und `$x, y \in V$`. `$x$` hei&szlig;t <strong>Kindknoten</strong> von `$y :\Leftrightarrow y$` ist Elternknoten von `$x$`.</div> <h3>Bin&auml;re B&auml;ume</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/binary-tree.png"><img src="../images/2012/07/binary-tree.png" alt="" width="500" height="277" class="size-full wp-image-33851"/></a><p class="wp-caption-text"></p></div> <div class="definition">Sei `$G = (V, E)$` ein Baum. `$G$` hei&szlig;t <strong>bin&auml;rer Baum</strong> `$:\Leftrightarrow \forall_{x \in V}: x$` hat h&ouml;chstens zwei Kindknoten.</div> <p>Ich beziehe mich im folgenden auf ungerichtete, bin&auml;re B&auml;ume. Soll hei&szlig;en, jeder Knoten kennt seine Kinder- <strong>und</strong> seinen Vaterknoten.</p> <p>Wie w&uuml;rde man das implementieren? Im Prinzip wie eine doppelt verkettete Liste. Jeder Knoten hat einen Zeiger auf den Eltern-Knoten und zwei Zeiger auf die Kindknoten. <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td><code>${\cal O}(|V| + |E|)$</code></td> <td>&rarr; <a href="http://de.wikipedia.org/wiki/Traversierung#Graphentheorie">Graphentraversierung</a></td> </tr> <tr> <td>Minimum</td> <td><code>${\cal O}(|V| + |E|)$</code></td> <td>&rarr; <a href="http://de.wikipedia.org/wiki/Traversierung#Graphentheorie">Graphentraversierung</a></td> </tr> <tr> <td>Maximum</td> <td><code>${\cal O}(|V| + |E|)$</code></td> <td>&rarr; <a href="http://de.wikipedia.org/wiki/Traversierung#Graphentheorie">Graphentraversierung</a></td> </tr> <tr> <td>Einf&uuml;gen</td> <td><code>${\cal O}(|V|)$</code></td> <td></td> </tr> <tr> <td>L&ouml;schen</td> <td><code>${\cal O}(|V| + |E|)$</code></td> <td>&rarr; Suchen</td> </tr> <tr> <td>Vorg&auml;nger</td> <td><code>${\cal O}(1)$</code></td> <td>Implementierungsabh&auml;ngig!</td> </tr> <tr> <td>Nachfolger</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> </table></p> <h3>Suchb&auml;ume</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/binary-search-tree.png"><img src="../images/2012/07/binary-search-tree.png" alt="" width="500" height="361" class="size-full wp-image-33871"/></a><p class="wp-caption-text"></p></div> <p>Dieser Baum hat die gleichen Werte wie der Baum oberhalb, aber es gilt nun: Der Wert aller Knoten links vom aktuellen Konten ist kleiner oder gleich dem des aktuelle, der Wert aller Knoten rechts davon ist echt gr&ouml;&szlig;er.</p> <p>Ich beschr&auml;nke mich hier auf bin&auml;re Suchb&auml;ume.</p> <p>Damit ergeben sich folgende Laufzeiten: Sei <code>$G = (V, E)$</code> ein beliebiger bin&auml;rer Suchbaum. Jeder Knoten kennt seine Kinder- <strong>und</strong> seinen Vaterknoten. <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td><code>${\cal O}(|V|)$</code></td> <td>&rarr; Verkettete Liste</td> </tr> <tr> <td>Minimum</td> <td><code>${\cal O}(|V|)$</code></td> <td>&rarr; Verkettete Liste</td> </tr> <tr> <td>Maximum</td> <td><code>${\cal O}(|V|)$</code></td> <td>&rarr; Verkettete Liste</td> </tr> <tr> <td>Einf&uuml;gen</td> <td><code>${\cal O}(|V|)$</code></td> <td>&rarr; Verkettete Liste</td> </tr> <tr> <td>L&ouml;schen</td> <td><code>${\cal O}(|V|)$</code></td> <td>&rarr; Verkettete Liste</td> </tr> <tr> <td>Vorg&auml;nger</td> <td><code>${\cal O}(1)$</code></td> <td>Implementierungsabh&auml;ngig!</td> </tr> <tr> <td>Nachfolger</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> </table></p> <h4>Rot-Schwarz-B&auml;ume</h4> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/red-black-tree1.png"><img src="../images/2012/07/red-black-tree1.png" alt="" width="500" height="244" class="size-full wp-image-34071"/></a><p class="wp-caption-text"></p></div> <p>Sei <code>$G = (V, E)$</code> ein bin&auml;rer Suchbaum. G hei&szlig;t Rot-Schwarz-Baum <code>$: \Leftrightarrow$</code> F&uuml;r G gilt: <ol> <li>Jeder Knoten ist entweder Rot oder Schwarz.</li> <li>Der Wurzelknoten ist schwarz.</li> <li>Die Blattknoten sind schwarz.</li> <li>Ein Knoten ist rot <code>$\Rightarrow$</code> Beide Kinder sind schwarz.</li> <li><code>$\forall x \in V:$</code> Alle Pfade von x zu einem Blatt haben die gleiche Anzahl schwarzer Knoten.</li> </ol></p> <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td>`${\cal O}(\lg n)$`</td> <td></td> </tr> <tr> <td>Minimum</td> <td>`${\cal O}(\lg n)$`</td> <td></td> </tr> <tr> <td>Maximum</td> <td>`${\cal O}(\lg n)$`</td> <td></td> </tr> <tr> <td>Einf&uuml;gen</td> <td>`${\cal O}(\lg n)$`</td> <td></td> </tr> <tr> <td>L&ouml;schen</td> <td>`${\cal O}(\lg n)$`</td> <td></td> </tr> <tr> <td>Vorg&auml;nger</td> <td>`${\cal O}(1)$`</td> <td></td> </tr> <tr> <td>Nachfolger</td> <td>`${\cal O}(1)$`</td> <td></td> </tr> </table> <p>Eine Python-Implementation ist hier zu finden: <a href="https://github.com/MartinThoma/algorithms/blob/master/datastructures/redBlackTree.py">https://github.com/MartinThoma/algorithms</a></p> <h3>Heaps</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/heap.png"><img src="../images/2012/07/heap.png" alt="" width="500" height="254" class="size-full wp-image-34361"/></a><p class="wp-caption-text"></p></div> <p>Ich beschr&auml;nke mich im folgenden auf <a href="http://de.wikipedia.org/wiki/Bin%C3%A4rer_Heap">bin&auml;re Min-Heaps</a>. <table> <tr> <th>Operation</th> <th>Worst-Case-Laufzeit</th> <th>Anmerkungen</th> </tr> <tr> <td>Suchen</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Falls als array dargestellt, einfach alle Elemente des Arrays durchlaufen</td> </tr> <tr style="background-color:#99FF99"> <td>Minimum</td> <td><code>${\cal O}(1)$</code></td> <td></td> </tr> <tr style="background-color:#99FF99"> <td>Extract-Minimum</td> <td><code>${\cal O}(\log n)$</code></td> <td>&rarr; Heapify</td> </tr> <tr> <td>Maximum</td> <td><code>${\cal O}(n)$</code></td> <td>&rarr; Suche</td> </tr> <tr> <td>Einf&uuml;gen</td> <td><code>${\cal O}(\log n)$</code></td> <td>&rarr; Heapify</td> </tr> <tr> <td>L&ouml;schen</td> <td><code>${\cal O}(\log n)$</code></td> <td>&rarr; Heapify (bei bekannter Position des Elements, sonst siehe Suche)</td> </tr> <tr> <td>Vorg&auml;nger</td> <td><code>${\cal O}(1)$</code></td> <td>Hat keine besondere Bedeutung in Heaps.</td> </tr> <tr> <td>Nachfolger</td> <td><code>${\cal O} (1)$</code></td> <td>Hat keine besondere Bedeutung in Heaps.</td> </tr> </table></p> <h3>B-B&auml;ume</h3> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-2.png"><img src="../images/2012/07/b-tree-2.png" alt="" width="500" height="124" class="size-full wp-image-34581"/></a><p class="wp-caption-text"></p></div> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/07/b-tree-3.png"><img src="../images/2012/07/b-tree-3.png" alt="" width="500" height="187" class="size-full wp-image-34591"/></a><p class="wp-caption-text"></p></div> <blockquote>Ein B-Baum ist ein immer vollst&auml;ndig balancierter Baum, der Daten sortiert nach Schl&uuml;sseln speichert. Er kann bin&auml;r sein, ist aber im Allgemeinen kein Bin&auml;rbaum. Das Einf&uuml;gen, Suchen und L&ouml;schen von Daten in B-B&auml;umen ist in amortisiert logarithmischer Zeit m&ouml;glich. B-B&auml;ume wachsen &ndash; und schrumpfen &ndash; anders als viele Suchb&auml;ume von den Bl&auml;ttern hin zur Wurzel.</blockquote> <p>Quelle: <a href="http://de.wikipedia.org/wiki/B-Baum">Wikipedia</a></p> <p>Die beiden abgebildeten B-B&auml;ume sind entstanden, indem die Zahlen von 0 bis 19 in aufsteigener Reihenfolge eingef&uuml;gt wurden.</p> <p>F&uuml;r einen B-Baum der Ordnung t, <code>$t \geq 2$</code>, gilt: <ul> <li>Alle Pfade von der Wurzel zu einem Blatt sind gleich lang.</li> <li>Die Wurzel hat mindestens 2, h&ouml;chstens 2t Kinder.</li> <li>Alle anderen inneren Knoten haben mindestens t, h&ouml;chstens 2t Kinder.</li> <li>Jeder Knoten mit i Kindern hat i-1 Schl&uuml;ssel.</li> </ul></p> <p>Die beiden B-B&auml;ume habe ich mit <a href="https://gist.github.com/3159687">diesem Script</a> erstellt.</p> <p>Mehr zu B-B&auml;umen gibt es in diesem <a href="../b-baume/" title="B-B&auml;ume">Artikel &uuml;ber B-B&auml;ume</a>.</p> <h3>Tries</h3> <div style="width: 200px" class="wp-caption aligncenter"><a href="../images/2012/07/trie.png"><img src="../images/2012/07/trie.png" alt="" width="200" height="285" class="size-full wp-image-34621"/></a><p class="wp-caption-text"></p></div> <p>Bildquelle: <a href="http://commons.wikimedia.org/wiki/File:Trie.svg">Wikipedia</a></p> <p>Ein Trie ist ein spezieller digitaler Baum. <blockquote>Ein Trie oder Pr&auml;fixbaum ist eine Datenstruktur, die in der Informatik zum Suchen nach Zeichenketten verwendet wird. Es handelt sich dabei um einen speziellen Suchbaum zur gleichzeitigen Speicherung mehrerer Zeichenketten.</blockquote> Quelle: <a href="http://de.wikipedia.org/wiki/Trie">Wikipedia</a></p> <p>Wo werden Tries genutzt? <ul> <li>Python charmap encoder (<a href="http://mail.python.org/pipermail/patches/2006-May/019891.html">source</a>)</li> <li>Der <a href="http://docs.oracle.com/javase/7/docs/api/java/text/Normalizer.html">Normalizer</a> scheint Tries zu verwenden.</li> </ul></p> Swing II: How to arrange Objects http://martin-thoma.com/swing-ii-how-to-arrange-objects Sat, 21 Jul 2012 15:00:44 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/swing-ii-how-to-arrange-objects <h2>Without GUI</h2> <p>Objects can be arranged with <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagLayout.html">GridBagLayout</a> and <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html">GridBagConstraints</a>. This is an example: <img src="../images/2012/07/java-swing-grid-bag.png" alt="GridBag example (Java Swing)" title="GridBag example (Java Swing)" width="198" height="199" class="size-full wp-image-33451" /></p> <p>Code:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.awt.GridBagConstraints</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.awt.GridBagLayout</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.awt.Insets</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.awt.MouseInfo</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.awt.Point</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JButton</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JFrame</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JPanel</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JTextField</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="c1">// Open the window where the mouse pointer is</span> <span class="n">Point</span> <span class="n">location</span> <span class="o">=</span> <span class="n">MouseInfo</span><span class="o">.</span><span class="na">getPointerInfo</span><span class="o">().</span><span class="na">getLocation</span><span class="o">();</span> <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="n">location</span><span class="o">.</span><span class="na">getX</span><span class="o">();</span> <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="n">location</span><span class="o">.</span><span class="na">getY</span><span class="o">();</span> <span class="n">JFrame</span> <span class="n">frame</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JFrame</span><span class="o">(</span><span class="s">&quot;My title!&quot;</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setLocation</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="mi">200</span><span class="o">,</span> <span class="mi">200</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setDefaultCloseOperation</span><span class="o">(</span><span class="n">JFrame</span><span class="o">.</span><span class="na">EXIT_ON_CLOSE</span><span class="o">);</span> <span class="n">JPanel</span> <span class="n">panel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JPanel</span><span class="o">(</span><span class="k">new</span> <span class="n">GridBagLayout</span><span class="o">());</span> <span class="n">frame</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">panel</span><span class="o">);</span> <span class="c1">//set the size of the window to the maximum</span> <span class="c1">//frame.setExtendedState(frame.getExtendedState() |</span> <span class="c1">// Frame.MAXIMIZED_BOTH);</span> <span class="n">JButton</span> <span class="n">button1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;1&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;2&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;3&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;4&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button5</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;5&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button6</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;6&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button7</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;7&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button8</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;8&quot;</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button9</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;9&quot;</span><span class="o">);</span> <span class="n">Insets</span> <span class="n">i</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Insets</span><span class="o">(</span><span class="mi">5</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span> <span class="n">JTextField</span> <span class="n">tf</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JTextField</span><span class="o">(</span><span class="mi">13</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">cText</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">cText</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">cText</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">cText</span><span class="o">.</span><span class="na">gridwidth</span> <span class="o">=</span> <span class="n">GridBagConstraints</span><span class="o">.</span><span class="na">REMAINDER</span><span class="o">;</span> <span class="n">cText</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">tf</span><span class="o">,</span><span class="n">cText</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c1</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">c1</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c1</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button1</span><span class="o">,</span> <span class="n">c1</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c2</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c2</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c2</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button2</span><span class="o">,</span> <span class="n">c2</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c3</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c3</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c3</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c3</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button3</span><span class="o">,</span> <span class="n">c3</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c4</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c4</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">c4</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c4</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button4</span><span class="o">,</span> <span class="n">c4</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c5</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c5</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c5</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c5</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button5</span><span class="o">,</span> <span class="n">c5</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c6</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c6</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c6</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c6</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button6</span><span class="o">,</span> <span class="n">c6</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c7</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c7</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">c7</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">c7</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button7</span><span class="o">,</span> <span class="n">c7</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c8</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c8</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">c8</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">c8</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button8</span><span class="o">,</span> <span class="n">c8</span><span class="o">);</span> <span class="n">GridBagConstraints</span> <span class="n">c9</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GridBagConstraints</span><span class="o">();</span> <span class="n">c9</span><span class="o">.</span><span class="na">gridx</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">c9</span><span class="o">.</span><span class="na">gridy</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">c9</span><span class="o">.</span><span class="na">insets</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button9</span><span class="o">,</span> <span class="n">c9</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>Google WindowBuilder</h2> <p>Goole offers a free Eclipse plugin called <a href="https://developers.google.com/java-dev-tools/wbpro/">WindowBuilder</a>:</p> <blockquote>WindowBuilder is a powerful and easy to use bi-directional Java GUI designer that makes it very easy to create Java GUI applications without spending a lot of time writing code to display simple forms.</blockquote> <h3>Installation</h3> <p>They offer great <a href="https://developers.google.com/java-dev-tools/wbpro/installation/">installation instructions</a>!</p> <p>(The download takes a while. Time to make a cup of tea.)</p> <h3>Editing</h3> <p>You have to open your project with the window builder: <div style="width: 285px" class="wp-caption aligncenter"><a href="../images/2012/07/eclipse-open-with-window-builder-285x300.png"><img src="../images/2012/07/eclipse-open-with-window-builder-285x300.png" alt="" width="285" height="300" class="size-medium wp-image-33501"/></a><p class="wp-caption-text"></p></div></p> <p>The Window-Builder-View looks like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/eclipse-window-builder-300x157.png"><img src="../images/2012/07/eclipse-window-builder-300x157.png" alt="" width="300" height="157" class="size-medium wp-image-33541"/></a><p class="wp-caption-text"></p></div></p> <p>You can easily resize the window: <div style="width: 258px" class="wp-caption aligncenter"><a href="../images/2012/07/eclipse-window-builder-resize-258x300.png"><img src="../images/2012/07/eclipse-window-builder-resize-258x300.png" alt="" width="258" height="300" class="size-medium wp-image-33521"/></a><p class="wp-caption-text"></p></div></p> <p>Positioning single components is also simple: <div style="width: 249px" class="wp-caption aligncenter"><a href="../images/2012/07/eclipse-window-builder-component.png"><img src="../images/2012/07/eclipse-window-builder-component.png" alt="" width="249" height="273" class="size-full wp-image-33531"/></a><p class="wp-caption-text"></p></div></p> <p>Adding a menu bar worked fine: <div style="width: 227px" class="wp-caption aligncenter"><a href="../images/2012/07/eclipse-window-builder-menu.png"><img src="../images/2012/07/eclipse-window-builder-menu.png" alt="" width="227" height="231" class="size-full wp-image-33561"/></a><p class="wp-caption-text"></p></div></p> <h2>See also</h2> <ul> <li><a href="http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html">How to Use GridBagLayout</a></li> <li><a href="http://stackoverflow.com/q/1832432/562769">Which Swing layout(s) do you recommend?</a></li> </ul> Swing I: How to use Swing http://martin-thoma.com/how-to-use-swing Fri, 20 Jul 2012 15:00:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-use-swing <p><a href="http://en.wikipedia.org/wiki/Swing_(Java)">Swing</a> is a Java package for creating graphical user interfaces (GUI). I will give you complete, runnable examples how you could use Swing. All examples are done in <code>test.java</code></p> <h2>Basic examples</h2> <h3>JFrame</h3> <p>The basic class is <a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html">JFrame</a>:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">javax.swing.JFrame</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">JFrame</span> <span class="n">frame</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JFrame</span><span class="o">(</span><span class="s">&quot;My title!&quot;</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="mi">200</span><span class="o">,</span> <span class="mi">200</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setDefaultCloseOperation</span><span class="o">(</span><span class="n">JFrame</span><span class="o">.</span><span class="na">EXIT_ON_CLOSE</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>You will get: <a href="../images/2012/07/java-swing-JFrame.png"><img src="../images/2012/07/java-swing-JFrame.png" alt="Java Swing: JFrame" title="Java Swing: JFrame" width="300" height="201" class="size-full wp-image-33311" /></a></p> <h3>JPanel</h3> <p>You add your elements to a JPanel:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">javax.swing.JButton</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JFrame</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JLabel</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JPanel</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">JFrame</span> <span class="n">frame</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JFrame</span><span class="o">(</span><span class="s">&quot;My title!&quot;</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="mi">300</span><span class="o">,</span> <span class="mi">150</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setDefaultCloseOperation</span><span class="o">(</span><span class="n">JFrame</span><span class="o">.</span><span class="na">EXIT_ON_CLOSE</span><span class="o">);</span> <span class="n">JPanel</span> <span class="n">panel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JPanel</span><span class="o">();</span> <span class="n">frame</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">panel</span><span class="o">);</span> <span class="n">JLabel</span> <span class="n">label</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JLabel</span><span class="o">(</span><span class="s">&quot;my label&quot;</span><span class="o">);</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">label</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;my button&quot;</span><span class="o">);</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>It looks like this: <a href="../images/2012/07/java-swing-jpanel.png"><img src="../images/2012/07/java-swing-jpanel.png" alt="Java Swing: JPanel, JLabel and JButton" title="Java Swing: JPanel, JLabel and JButton" width="300" height="151" class="size-full wp-image-33341" /></a></p> <h2>Action Listeners</h2> <p>This is the most simple example of an <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html">ActionListener</a>. When you click on the button, it creates a new JFrame.</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.awt.event.ActionEvent</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.awt.event.ActionListener</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JButton</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JFrame</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JLabel</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">javax.swing.JPanel</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">JFrame</span> <span class="n">frame</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JFrame</span><span class="o">(</span><span class="s">&quot;My title!&quot;</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="mi">300</span><span class="o">,</span> <span class="mi">150</span><span class="o">);</span> <span class="n">frame</span><span class="o">.</span><span class="na">setDefaultCloseOperation</span><span class="o">(</span><span class="n">JFrame</span><span class="o">.</span><span class="na">EXIT_ON_CLOSE</span><span class="o">);</span> <span class="n">JPanel</span> <span class="n">panel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JPanel</span><span class="o">();</span> <span class="n">frame</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">panel</span><span class="o">);</span> <span class="n">JLabel</span> <span class="n">label</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JLabel</span><span class="o">(</span><span class="s">&quot;my label&quot;</span><span class="o">);</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">label</span><span class="o">);</span> <span class="n">JButton</span> <span class="n">button</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JButton</span><span class="o">(</span><span class="s">&quot;my button&quot;</span><span class="o">);</span> <span class="n">panel</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">button</span><span class="o">);</span> <span class="n">button</span><span class="o">.</span><span class="na">addActionListener</span><span class="o">(</span><span class="k">new</span> <span class="n">MyAction</span><span class="o">());</span> <span class="o">}</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyAction</span> <span class="kd">implements</span> <span class="n">ActionListener</span> <span class="o">{</span> <span class="nd">@Override</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">actionPerformed</span><span class="o">(</span><span class="n">ActionEvent</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">JFrame</span> <span class="n">frame2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JFrame</span><span class="o">(</span><span class="s">&quot;clicked&quot;</span><span class="o">);</span> <span class="n">frame2</span><span class="o">.</span><span class="na">setVisible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> <span class="n">frame2</span><span class="o">.</span><span class="na">setSize</span><span class="o">(</span><span class="mi">200</span><span class="o">,</span><span class="mi">200</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <h2>See also</h2> <ul> <li><a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/package-summary.html">Java 7 Swing Documentation</a></li> <li><a href="http://docs.oracle.com/javase/tutorial/uiswing/">Trail: Creating a GUI With JFC/Swing</a></li> </ul> <div class="info">Continue with part II: <a href="../swing-ii-how-to-arrange-objects/">How to arrange Objects with Swing</a></div> How to parse command line arguments in Java http://martin-thoma.com/how-to-parse-command-line-arguments-in-java Thu, 19 Jul 2012 15:00:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-parse-command-line-arguments-in-java <p>If you are using Eclipse, you might want to add your arguments. To specify them, go to: Run &rarr; Run Configurations ... &rarr; Arguments</p> <h2>args4j</h2> <blockquote>args4j is a small Java class library that makes it easy to parse command line options/arguments in your CUI application.</blockquote> <p>Source: <a href="http://args4j.kohsuke.org/">args4j.kohsuke.org</a></p> <p>Lets see how easy it really is.</p> <h3>Requirements</h3> <p>First, you have to get the package. It is not in my Ubuntu-Version, but <a href="http://packages.ubuntu.com/quantal/libargs4j-java">Ubuntu Quantal will have args4j</a>. The package is called <code>libargs4j-java</code>.</p> <p>If you can&#39;t install it this way, you have to <a href="http://maven.jenkins-ci.org/content/repositories/releases/args4j/">download args4j</a>. Currently, it is <a href="http://maven.jenkins-ci.org/content/repositories/releases/args4j/args4j/2.0.21/args4j-2.0.21.jar">args4j-2.0.21.jar</a>.</p> <p>You can add this as an external jar to Eclipse: <ol> <li>Right-click on your project.</li> <li>Select &quot;Properties&quot;</li> <li>Type &quot;java build path&quot; in the input field at the upper left corner of the window.</li> </ol></p> <p>Now it should look like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/java-eclipse-project-properties-libraries-300x214.png"><img src="../images/2012/07/java-eclipse-project-properties-libraries-300x214.png" alt="" width="300" height="214" class="size-medium wp-image-33151"/></a><p class="wp-caption-text"></p></div></p> <p>Now you have to click on &quot;Add External Jar&quot; and add the args4j.jar file.</p> <h3>Source Example</h3> <p>As always in Java, you add another class for parsing your command line values. I&#39;ve called it CommandLineValues.java and it does only check for the command line argument <code>-i FILE</code> or <code>--input FILE</code>.</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.kohsuke.args4j.CmdLineException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.kohsuke.args4j.CmdLineParser</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.kohsuke.args4j.Option</span><span class="o">;</span> <span class="cm">/**</span> <span class="cm"> * This class handles the programs arguments.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">CommandLineValues</span> <span class="o">{</span> <span class="nd">@Option</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;-i&quot;</span><span class="o">,</span> <span class="n">aliases</span> <span class="o">=</span> <span class="o">{</span> <span class="s">&quot;--input&quot;</span> <span class="o">},</span> <span class="n">required</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">usage</span> <span class="o">=</span> <span class="s">&quot;input file with two matrices&quot;</span><span class="o">)</span> <span class="kd">private</span> <span class="n">File</span> <span class="n">source</span><span class="o">;</span> <span class="kd">private</span> <span class="kt">boolean</span> <span class="n">errorFree</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="kd">public</span> <span class="nf">CommandLineValues</span><span class="o">(</span><span class="n">String</span><span class="o">...</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">CmdLineParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CmdLineParser</span><span class="o">(</span><span class="k">this</span><span class="o">);</span> <span class="n">parser</span><span class="o">.</span><span class="na">setUsageWidth</span><span class="o">(</span><span class="mi">80</span><span class="o">);</span> <span class="k">try</span> <span class="o">{</span> <span class="n">parser</span><span class="o">.</span><span class="na">parseArgument</span><span class="o">(</span><span class="n">args</span><span class="o">);</span> <span class="k">if</span> <span class="o">(!</span><span class="n">getSource</span><span class="o">().</span><span class="na">isFile</span><span class="o">())</span> <span class="o">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nf">CmdLineException</span><span class="o">(</span><span class="n">parser</span><span class="o">,</span> <span class="s">&quot;--input is no valid input file.&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="n">errorFree</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">CmdLineException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">e</span><span class="o">.</span><span class="na">getMessage</span><span class="o">());</span> <span class="n">parser</span><span class="o">.</span><span class="na">printUsage</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Returns whether the parameters could be parsed without an</span> <span class="cm"> * error.</span> <span class="cm"> *</span> <span class="cm"> * @return true if no error occurred.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isErrorFree</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">errorFree</span><span class="o">;</span> <span class="o">}</span> <span class="cm">/**</span> <span class="cm"> * Returns the source file.</span> <span class="cm"> *</span> <span class="cm"> * @return The source file.</span> <span class="cm"> */</span> <span class="kd">public</span> <span class="n">File</span> <span class="nf">getSource</span><span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="n">source</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Here is some part of the main file:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">CommandLineValues</span> <span class="n">values</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CommandLineValues</span><span class="o">(</span><span class="n">args</span><span class="o">);</span> <span class="n">CmdLineParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CmdLineParser</span><span class="o">(</span><span class="n">values</span><span class="o">);</span> <span class="k">try</span> <span class="o">{</span> <span class="n">parser</span><span class="o">.</span><span class="na">parseArgument</span><span class="o">(</span><span class="n">args</span><span class="o">);</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">CmdLineException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="o">}</span> <span class="c1">// Now you can use the command line values</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="n">matrices</span> <span class="o">=</span> <span class="n">read</span><span class="o">(</span><span class="n">values</span><span class="o">.</span><span class="na">getSource</span><span class="o">());</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="n">ijkAlgorithm</span><span class="o">(</span><span class="n">A</span><span class="o">,</span> <span class="n">B</span><span class="o">);</span> <span class="n">printMatrix</span><span class="o">(</span><span class="n">C</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <h3>Usage Examples</h3> <p>If you do not specify the required parameters, you get a quite good error message:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop<span class="sb">`</span><span class="nv">$ </span>java -jar matrix-multiplication.jar Option <span class="s2">&quot;-i (--input)&quot;</span> is required -i <span class="o">(</span>--input<span class="o">)</span> FILE : input file with two matrices </code></pre></div> <p>Help is <strong>not</strong> automatically generated:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop<span class="nv">$`</span> java -jar matrix-multiplication.jar --help <span class="s2">&quot;--help&quot;</span> is not a valid option -i <span class="o">(</span>--input<span class="o">)</span> FILE : input file with two matrices </code></pre></div> <p>If you want to have default parameters, you simply assign the values to the attributes:</p> <div class="highlight"><pre><code class="java"><span class="nd">@Option</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;-l&quot;</span><span class="o">,</span> <span class="n">aliases</span> <span class="o">=</span> <span class="o">{</span> <span class="s">&quot;--leafsize&quot;</span> <span class="o">},</span> <span class="n">required</span> <span class="o">=</span> <span class="kc">false</span><span class="o">,</span> <span class="n">usage</span> <span class="o">=</span> <span class="s">&quot;input file with two matrices&quot;</span><span class="o">)</span> <span class="kd">private</span> <span class="kt">int</span> <span class="n">leafsize</span> <span class="o">=</span> <span class="mi">32</span><span class="o">;</span> </code></pre></div> <p>Note: <a href="http://stackoverflow.com/q/7834111/562769">How can I prevent Eclipse from adding the &#39;final&#39; for certain lines of Java code?</a></p> <h2>Commons CLI</h2> <h3>Installation</h3> <p>As for args4j, they offer a jar file which is in <a href="http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist//commons/cli/binaries/commons-cli-1.2-bin.tar.gz">commons-cli-1.2-bin.tar.gz</a> on the <a href="http://commons.apache.org/cli/download_cli.cgi">download-page</a>.</p> <p>If you just want to test if you have the required packages, copy this piece of code to Eclipse:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CommandLineValues</span> <span class="o">{</span> <span class="n">CommandLineParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicParser</span><span class="o">();</span> <span class="o">}</span> </code></pre></div> <p>If you get the following error, you don&#39;t have the required <code>org.apache.commons.cli</code>: <div style="width: 431px" class="wp-caption aligncenter"><a href="../images/2012/07/java-eclipse-cli-lib-error.png"><img src="../images/2012/07/java-eclipse-cli-lib-error.png" alt="" width="431" height="89" class="size-full wp-image-33201"/></a><p class="wp-caption-text"></p></div></p> <h3>Usage examples</h3> <p>I have not found a single, complete and working usage example.</p> <h2>See also</h2> <ul> <li><a href="http://stackoverflow.com/q/367706/562769">Is there a good command line argument parser for Java?</a> - A lot of other command line parsers are mentioned for Java.</li> <li><a href="http://args4j.kohsuke.org/args4j/apidocs/">args4j JavaDoc</a></li> <li><a href="http://commons.apache.org/cli/api-release/index.html">Apache CLI JavaDoc</a></li> </ul> How to parse command line arguments in Python http://martin-thoma.com/how-to-parse-command-line-arguments-in-python Wed, 18 Jul 2012 15:00:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-parse-command-line-arguments-in-python <h2>Argparse</h2> <blockquote>The <a href="http://docs.python.org/library/argparse.html">argparse module</a> makes it easy to write user-friendly command-line interfaces. The program defines what arguments it requires, and argparse will figure out how to parse those out of sys.argv. The argparse module also automatically generates help and usage messages and issues errors when users give the program invalid arguments.</blockquote> <h3>Installation</h3> <p>I had to install <code>python-argparse</code> on my old Ubuntu machine before I could use it.</p> <h3>Usage</h3> <p>As far as I&#39;ve just tried it, you can use argparse very similar to optparse. See this <a href="https://github.com/MartinThoma/matrix-multiplication/commit/7af938c54fd2effee3efe74352b76f01d2e817e5#Python/ikjMultiplication.py">diff</a> for my switch from optparse to argparse for a simple script.</p> <p>It is very easy to add command line <del>options</del> argument (if you require an option, it would not be an option any more, would it? I&#39;ll try to call them arguments from now on):</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">()</span> <span class="c"># Add more options if you like</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-f&quot;</span><span class="p">,</span> <span class="s">&quot;--file&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;myFilenameVariable&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;write report to FILE&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-q&quot;</span><span class="p">,</span> <span class="s">&quot;--quiet&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_false&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;verbose&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;don&#39;t print status messages to stdout&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">print</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">myFilenameVariable</span><span class="p">)</span> </code></pre></div> <p>Every option has some values like: <ul> <li><a href="http://docs.python.org/library/argparse.html#dest">dest</a>: You will access the value of option with this variable</li> <li><a href="http://docs.python.org/library/argparse.html#help">help</a>: This text gets displayed whey someone uses <code>--help</code>.</li> <li><a href="http://docs.python.org/library/argparse.html#default">default</a>: If the command line argument was not specified, it will get this default value.</li> <li><a href="http://docs.python.org/library/argparse.html#action">action</a>: Actions tell optparse what to do when it encounters an option on the command line. <code>action</code> defaults to <code>store</code>. These actions are available: <ul> <li><strong>store</strong>: take the next argument (or the remainder of the current argument), ensure that it is of the correct type, and store it to your chosen destination dest.</li> <li><strong>store<em>true</strong>: store <code>True</code> in dest if this flag was set.</li> <li><strong>store</em>false</strong>: store <code>False</code> in dest if this flag was set.</li> <li><strong>store<em>const</strong>: store a constant value</li> <li><strong>append</strong>: append this option&rsquo;s argument to a list</li> <li><strong>count</strong>: increment a counter by one</li> <li><strong>callback</strong>: call a specified function</li> </ul> </li> <li><a href="http://docs.python.org/library/argparse.html#nargs">nargs</a>: ArgumentParser objects usually associate a single command-line argument with a single action to be taken. The nargs keyword argument associates a different number of command-line arguments with a single action.</li> <li><a href="http://docs.python.org/library/argparse.html#required">required</a>: Mark a command line argument as non-optional (required).</li> <li><a href="http://docs.python.org/library/argparse.html#choices">choices</a>: Some command-line arguments should be selected from a restricted set of values. These can be handled by passing a container object as the choices keyword argument to add</em>argument(). When the command line is parsed, argument values will be checked, and an error message will be displayed if the argument was not one of the acceptable values.</li> <li><a href="http://docs.python.org/library/argparse.html#type">type</a>: Use this command, if the argument is of another type (e.g. int or float).</li> </ul></p> <p>argparse automatically generates a help text. So if you call <code>python myScript.py --help</code> you will get something like that:</p> <div class="highlight"><pre><code class="bash">usage: ikjMultiplication.py <span class="o">[</span>-h<span class="o">]</span> <span class="o">[</span>-i FILE<span class="o">]</span> ikjMatrix multiplication optional arguments: -h, --help show this <span class="nb">help </span>message and <span class="nb">exit</span> -i FILE input file with two matrices </code></pre></div> <h3>Example 1: Fibonacci</h3> <p>It is absolutely no problem to calculate the 100,000st Fibonacci number.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">A</span> <span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">a</span><span class="o">*</span><span class="n">d</span> <span class="o">+</span> <span class="n">b</span><span class="o">*</span><span class="n">e</span><span class="p">,</span> <span class="n">a</span><span class="o">*</span><span class="n">e</span> <span class="o">+</span> <span class="n">b</span><span class="o">*</span><span class="n">f</span><span class="p">,</span> <span class="n">b</span><span class="o">*</span><span class="n">e</span> <span class="o">+</span> <span class="n">c</span><span class="o">*</span><span class="n">f</span> <span class="k">def</span> <span class="nf">pow</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">A</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">),</span> <span class="n">n</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="nb">pow</span><span class="p">(</span><span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">),</span> <span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span><span class="p">))</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">argparse</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;Fibonacci-Script&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-n&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&#39;N&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;print the N-th fibonacci number&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">print</span> <span class="n">fib</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">n</span><span class="p">)</span> </code></pre></div> <p>Note that it uses <code>type=int</code> not <code>type=&quot;int&quot;</code> as it was in optparse. </p> <h3>Example 2: less</h3> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">A</span> <span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">a</span><span class="o">*</span><span class="n">d</span> <span class="o">+</span> <span class="n">b</span><span class="o">*</span><span class="n">e</span><span class="p">,</span> <span class="n">a</span><span class="o">*</span><span class="n">e</span> <span class="o">+</span> <span class="n">b</span><span class="o">*</span><span class="n">f</span><span class="p">,</span> <span class="n">b</span><span class="o">*</span><span class="n">e</span> <span class="o">+</span> <span class="n">c</span><span class="o">*</span><span class="n">f</span> <span class="k">def</span> <span class="nf">pow</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">A</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">),</span> <span class="n">n</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="nb">pow</span><span class="p">(</span><span class="n">mul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">A</span><span class="p">),</span> <span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span><span class="p">))</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">n</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">argparse</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;less script&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-f&quot;</span><span class="p">,</span> <span class="s">&quot;--file&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;write report to FILE&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-n&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;n&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;how many lines get printed&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-q&quot;</span><span class="p">,</span> <span class="s">&quot;--quiet&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_false&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;verbose&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;don&#39;t print status messages to stdout&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Will open file now and print </span><span class="si">%i</span><span class="s"> lines.&quot;</span> <span class="o">%</span> <span class="n">args</span><span class="o">.</span><span class="n">n</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">n</span><span class="p">):</span> <span class="k">print</span> <span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span> </code></pre></div> <h2>Optparse</h2> <div class="info">Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.</div> <p>Parsing command line arguments with <a href="http://docs.python.org/library/optparse.html">optparse</a> was very easy, but as it is deprecated and argparse works almost the same way, I will not make any examples. Just use argparse.</p> <h2>See also</h2> <ul> <li><a href="http://stackoverflow.com/q/3217673/562769">Why use argparse rather than optparse?</a></li> <li><a href="http://stackoverflow.com/q/8387924/562769">Python argparse and bash completion</a></li> </ul> Java Puzzle #3: Rounding http://martin-thoma.com/java-puzzle-3-rounding Tue, 17 Jul 2012 15:00:53 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-3-rounding <h2>The puzzle</h2> <p>What is the output of the following script:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">x</span> <span class="o">=</span> <span class="mf">0.4999999999999999</span><span class="o">;</span> <span class="kt">double</span> <span class="n">y</span> <span class="o">=</span> <span class="mf">0.49999999999999992</span><span class="o">;</span> <span class="kt">double</span> <span class="n">z</span> <span class="o">=</span> <span class="mf">0.49999999999999994</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">x</span> <span class="o">+</span> <span class="s">&quot; rounded is &quot;</span> <span class="o">+</span> <span class="n">Math</span><span class="o">.</span><span class="na">round</span><span class="o">(</span><span class="n">x</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">y</span> <span class="o">+</span> <span class="s">&quot; rounded is &quot;</span> <span class="o">+</span> <span class="n">Math</span><span class="o">.</span><span class="na">round</span><span class="o">(</span><span class="n">y</span><span class="o">));</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">z</span> <span class="o">+</span> <span class="s">&quot; rounded is &quot;</span> <span class="o">+</span> <span class="n">Math</span><span class="o">.</span><span class="na">round</span><span class="o">(</span><span class="n">z</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="bash">0.4999999999999999 rounded is 0 0.49999999999999994 rounded is 1 0.49999999999999994 rounded is 1 </code></pre></div> <h2>Explanation</h2> <p>It&#39;s a <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6430675">bug</a>. </p> <p>See also: <a href="http://stackoverflow.com/q/9902968/562769">Why does Math.round(0.49999999999999994) return 1</a></p> Java Puzzle #2: Integers and Floats http://martin-thoma.com/java-puzzle-2-integers-and-floats Mon, 16 Jul 2012 15:00:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-2-integers-and-floats <h2>Basics</h2> <p>As you might know, Americans measure the temperature in <a href="http://en.wikipedia.org/wiki/Fahrenheit">Fahrenheit</a>. I&#39;m not quite sure, but I guess the rest of the world uses <a href="http://en.wikipedia.org/wiki/Celsius">Celsius</a>.</p> <p>0&deg; C is the temperature when water freezes. 100&deg; C is the temperature when water boils.</p> <p>0&deg; F is the lowest temperature of the winter 1708/1709 in <a href="http://en.wikipedia.org/wiki/Gda%C5%84sk">Gdańsk</a>. 32&deg; F is the temperature when water boils.</p> <p>If you want to calculate the temperature <code>$T_C$</code> in &deg;C from <code>$T_F$</code> in &deg;F you can use this formula: <code>$T_C = (T_F &amp;minus; 32) &amp;middot; \frac{5}{9}$</code></p> <h2>The puzzle</h2> <p>What is the output of the following script?</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">static</span> <span class="kt">double</span> <span class="nf">fahrenheitToCelsius</span><span class="o">(</span><span class="kt">double</span> <span class="n">fahrenheit</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="o">(</span><span class="n">fahrenheit</span> <span class="o">-</span> <span class="mi">32</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="mi">5</span> <span class="o">/</span> <span class="mi">9</span><span class="o">);</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">double</span> <span class="n">fahrenheit</span> <span class="o">=</span> <span class="mi">100</span><span class="o">;</span> <span class="kt">double</span> <span class="n">celsius</span> <span class="o">=</span> <span class="n">fahrenheitToCelsius</span><span class="o">(</span><span class="n">fahrenheit</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;%.2f&amp;deg; Fahrenheit is %.2f&amp;deg; C\n&quot;</span><span class="o">,</span> <span class="n">fahrenheit</span><span class="o">,</span> <span class="n">celsius</span><span class="o">);</span> <span class="n">fahrenheit</span> <span class="o">=</span> <span class="mi">30</span><span class="o">;</span> <span class="n">celsius</span> <span class="o">=</span> <span class="n">fahrenheitToCelsius</span><span class="o">(</span><span class="n">fahrenheit</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;%.2f&amp;deg; Fahrenheit is %.2f&amp;deg; C\n&quot;</span><span class="o">,</span> <span class="n">fahrenheit</span><span class="o">,</span> <span class="n">celsius</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="bash">100.00<span class="p">&amp;</span>deg<span class="p">;</span> Fahrenheit is 0.00<span class="p">&amp;</span>deg<span class="p">;</span> C 30.00<span class="p">&amp;</span>deg<span class="p">;</span> Fahrenheit is -0.00<span class="p">&amp;</span>deg<span class="p">;</span> C </code></pre></div> <h2>Explanation</h2> <p>The problem is integer division.</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;5 / 9 = %.2f\n&quot;</span><span class="o">,</span> <span class="o">(</span><span class="kt">double</span><span class="o">)</span> <span class="o">(</span><span class="mi">5</span> <span class="o">/</span> <span class="mi">9</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>This outputs:</p> <div class="highlight"><pre><code class="bash">5 / <span class="nv">9</span> <span class="o">=</span> 0.00 </code></pre></div> <p>So you are multiplying with <code>$\pm 0$</code> instead of <code>$0.55555$</code>.</p> Algorithmen-Klausur http://martin-thoma.com/algorithmen-klausur Mon, 16 Jul 2012 07:00:25 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/algorithmen-klausur <p>F&uuml;r die Klausur in Algorithmen I sollte man Folgendes auf jeden Fall wissen: <ul> <li>Wie sind die Landau-Symbole <code>$\cal O(f(n)), \Theta(f(n)), \Omega(f(n))$</code> definiert? &rarr; <a title="Definitionen aus GBI" href="../definitionen-aus-gbi/#Komplexittstheorie">Antwort</a></li> <li>Wie lautet das Master-Theorem? &rarr; <a href="http://de.wikipedia.org/wiki/Master-Theorem#Allgemeine_Form">Antwort</a></li> <li>Wie funktioniert der Bellman-Ford-Algorithmus und was macht er? &rarr; <a href="http://de.wikipedia.org/wiki/Bellman-Ford-Algorithmus">Antwort</a></li> <li>Wie funktioniert der Dijkstra-Algorithmus und was macht er? &rarr; <a href="http://de.wikipedia.org/wiki/Dijkstra-Algorithmus">Antwort</a></li> <li>Wie funktioniert der Algorithmus von Kruskal und was macht er? &rarr; <a href="http://de.wikipedia.org/wiki/Algorithmus_von_Kruskal">Antwort</a></li> <li>Wie funktioniert der Algorithmus von Prim und was macht er? &rarr; <a href="http://de.wikipedia.org/wiki/Algorithmus_von_Prim">Antwort</a></li> <li>Was ist ein Heap, ein B-Baum, ein Digitaler Baum und was ein Suchbaum? &rarr; <a href="../ubersicht-uber-datenstrukturen/">Antwort</a></li> <li>Sei <code>$A := $</code> {Insertionsort, Quicksort, Mergesort, Heapsort, Selectionsort}. Beantworte und begr&uuml;nde f&uuml;r <code>$x \in A$</code> folgende Fragen: <ul> <li>Wie funktioniert x?</li> <li>Ist x stabil?</li> <li>Arbeitet x in-place?</li> <li>Hat x im Worst-Case optimales Laufzeitverhalten?</li> <li>Hat x im Worst-Case optimales Speicherplatzverhalten?</li> </ul></p> <p>&rarr; <a href="../ubersicht-uber-sortieralgorithmen/" title="&Uuml;bersicht &uuml;ber Sortieralgorithmen">Antwort</a> </li> <li>Wie funktioniert Radixsort? &rarr; <a href="http://de.wikipedia.org/wiki/Radixsort">Antwort</a></li> <li>Warum ist Radixsort und <a href="http://de.wikipedia.org/wiki/Countingsort">Countingsort</a> nur schlecht mit den Sortieralgorithmen aus vergleichbar?</li> <li>Welches Worst-Case Laufzeitverhalten hat die <a href="http://de.wikipedia.org/wiki/Breitensuche#Laufzeit">Breitensuche</a>, welches die <a href="http://de.wikipedia.org/wiki/Tiefensuche#Laufzeit">Tiefensuche</a>?</li> </ul> <h2>Some Random Facts</h2> Das ist ein Graph, bei dem der Algorithmus von Dijkstra fehlschl&auml;gt:</p> <div style="width: 278px" class="wp-caption aligncenter"><a href="../images/2012/07/dijkstra-fail.gif"><img src="../images/2012/07/dijkstra-fail.gif" alt="" width="278" height="278" class=" wp-image-31761 "/></a><p class="wp-caption-text"></p></div> <h2>Termine</h2> <p><strong>Datum</strong>: Dienstag, der 31.07.2012 um 17:00 Uhr <strong>Ort</strong>: <blockquote>Die Sitze sind alphabetisch nach Ihrem Nachnamen eingeteilt: A-C H&ouml;rsaal am Fasanengarten(50.35) D-J Gerthsen H&ouml;rsaal(30.21) K-O Audimax(30.95) P-R Daimler(10.21) S Benz(10.21) T-V Tulla(11.40) W-Z Neue Chemie(30.46) </blockquote></p> <p><strong>Dauer</strong>: 120 min. (<a href="https://studium.kit.edu/sites/vab/0x32F499D5541AEE45A9509B71A4796335/Start/homepage.aspx">Quelle</a>) <strong>Punkte</strong>: 60 <strong>&Uuml;bungsschein</strong>: Gibt es nicht. Bonuspunkte gibt es auch nicht. <strong>Sitzplatzverteilung</strong>: <a href="https://studium.kit.edu/sites/vab/0x32F499D5541AEE45A9509B71A4796335/Vorlesungsunterlagen/Forms/AllItems.aspx">hier</a></p> <h2>Nicht vergessen</h2> <ul> <li>Studentenausweis</li> <li>Kugelschreiber</li> </ul> <h2>Klausurergebnisse</h2> <p>Die Klausurergebnisse h&auml;ngen im SCC, 3. OG, aus.</p> <p><strong>Klausureinsicht</strong>: 23.08.2012 und 24.08.2012</p> Übersicht über Sortieralgorithmen http://martin-thoma.com/ubersicht-uber-sortieralgorithmen Sun, 15 Jul 2012 13:00:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ubersicht-uber-sortieralgorithmen <p>Eine &Uuml;bersicht &uuml;ber g&auml;ngige Sortieralgorithmen:</p> <h2>Vergleichsbasiert</h2> <table> <tr> <th rowspan="2" style="border-bottom: #000 double 3px;">Name</th> <th colspan="3" style="background-color:#cf3;text-align:center">Laufzeit</th> <th rowspan="2" style="border-bottom: #000 double 3px;">stabil</th> <th rowspan="2" style="border-bottom: #000 double 3px;">in-place</th> </tr> <tr> <th style="background-color:#cf3;border-bottom: #000 double 3px;">B</th> <th style="background-color:#cf3;border-bottom: #000 double 3px;">AVG</th> <th style="background-color:#cf3;border-bottom: #000 double 3px;">W</th> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Selectionsort">Selectionsort</a></th> <td>`$\Theta (n^2)$`</td> <td>`$\Theta (n^2)$`</td> <td>`$\Theta (n^2)$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="size-full wp-image-12931" /></a><small>[1]</small></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Bubblesort">Bubblesort</a></th> <td>`$\Theta (n)$`</td> <td>`$\cal{O}(n^2)$`</td> <td>`$\Theta (n^2)$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></a></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Insertionsort">Insertionsort</a></th> <td>`$\Theta (n)$`</td> <td>`$\Theta (n^2)$`</td> <td>`$\Theta (n^2)$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></a></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Quicksort">Quicksort</a></th> <td>`$\Theta (n \cdot log(n))$`</td> <td>`$\Theta (n \cdot log(n))$`</td> <td>`$\Theta (n^2)$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="size-full wp-image-12931" /></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Heapsort">Heapsort</a></th> <td>`$\cal{O}(n \cdot log(n))$`</td> <td>`$\cal{O}(n \cdot log(n))$`</td> <td>`$\cal{O}(n \cdot log(n))$`</td> <td><a href="../images/2012/01/no.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></a></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Mergesort">Mergesort</a></th> <td>`$\Theta (n \cdot log(n))$`</td> <td>`$\Theta (n \cdot log(n))$`</td> <td>`$\Theta (n \cdot log(n))$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><a href="../images/2012/01/no.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></a><small>[2]</small></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Timsort">Timsort</a></th> <td>`$\Theta (n)$`</td> <td>`$\cal{O}(n \cdot log(n))$`</td> <td>`$\cal{O}(n \cdot log(n))$`</td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><a href="../images/2012/01/no.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></a></td> </tr> </table> <p>Ich habe - bis auf Timsort - jeden dieser Algorithmen in Python implementiert, siehe <a href="https://github.com/MartinThoma/algorithms/blob/master/sorting.py">Python-Code f&uuml;r Sortieralgorithmen</a>.</p> <p><small>[1]</small>: Beispiel: A = [2, 2, 1] <small>[2]</small>: in der regel nicht in-place, kann aber auch in-place implementiert werden.</p> <h2>Nicht Vergleichsbasiert</h2> <p>Es sei <ul> <li><code>$n$</code> die Anzahl der Zahlen, </li> <li><code>$d$</code> die maximale Anzahl der Stellen</li> <li><code>$k$</code> die Anzahl der m&ouml;glichen Zeichen (die Basis).</li> </ul></p> <p>Dann gilt: <table> <tr> <th style="border-bottom: #000 double 3px;">Name</th> <th style="border-bottom: #000 double 3px;text-align:center">Worst-Case Laufzeit</th> <th style="border-bottom: #000 double 3px;">stabil</th> <th style="border-bottom: #000 double 3px;">in-place</th> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Radixsort">Radixsort</a></th> <td><code>$\cal{O}(d \cdot (n+k))$</code></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></a></td> <td><a href="../images/2012/01/no.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></a></td> </tr> <tr> <th><a href="http://de.wikipedia.org/wiki/Countingsort">Countingsort</a></th> <td><code>$\cal{O}(n+k)$</code></td> <td><a href="../images/2012/01/yes.png"><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></a></td> <td><a href="../images/2012/01/no.png"><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></a></td> </tr> </table></p> <h2>Siehe auch</h2> <ul> <li><a href="http://www.sorting-algorithms.com/">Sorting Algorithm Animations</a>: Eine tolle Website, die veranschaulicht, wie verschiedene Sortieralgorithmen funktionieren.</li> <li><a href="http://www.youtube.com/watch?v=t8g-iYGHpEA">What different sorting algorithms sound like</a></li> </ul> How to search for mathematical symbols in LaTeX http://martin-thoma.com/how-to-search-for-mathematical-symbols-in-latex Sat, 14 Jul 2012 17:00:44 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-search-for-mathematical-symbols-in-latex <h2>Detexify</h2> <p>The easiest way to search for a math symbol is <a href="http://detexify.kirelabs.org/classify.html">Detexify</a>. This webservices allows you to draw the symbol. It looks like this:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/07/detexify.png"><img src="../images/2012/07/detexify.png" alt="" width="512" height="332" class="size-full wp-image-31471"/></a><p class="wp-caption-text"></p></div> <h2>Symbol tables</h2> <h3>Arrows</h3> <table> <tr> <td>`$\rightarrow$`</td><td>\rightarrow</td> <td>`$\leftarrow$`</td><td>\leftarrow</td> <td>`$\Rightarrow$`</td><td>\Rightarrow</td> <td>`$\Leftarrow$`</td><td>\Leftarrow</td> </tr> <tr> <td>`$\leftrightarrow$`</td><td>\leftrightarrow</td> <td>`$\Leftrightarrow$`</td><td>\Leftrightarrow</td> <td>`$\nRightarrow$`</td><td>\nRightarrow</td> <td>`$\nrightarrow$`</td><td>\nrightarrow</td> </tr> <tr> <td>`$\leadsto$`</td><td>\leadsto</td> <td>`$\mapsto$`</td><td>\mapsto</td> <td>.</td><td>.</td> <td>.</td><td>.</td> </tr> </table> <h3>Greek</h3> <table> <tr> <td>`$\alpha$`</td><td>\alpha</td> <td>`$\beta$`</td><td>\beta</td> <td>`$\gamma$`</td><td>\gamma</td> <td>`$\delta$`</td><td>\delta</td> </tr> <tr> <td>`$\zeta$`</td><td>\zeta</td> <td>`$\eta$`</td><td>\eta</td> <td>`$\theta$`</td><td>\theta</td> <td>`$\epsilon, \varepsilon$`</td><td>\epsilon, \varepsilon</td> </tr> <tr> <td>`$\iota$`</td><td>\iota</td> <td>`$\kappa$`</td><td>\kappa</td> <td>`$\lambda$`</td><td>\lambda</td> <td>`$\mu$`</td><td>\mu</td> </tr> <tr> <td>`$\nu$`</td><td>\nu</td> <td>`$\xi$`</td><td>\xi</td> <td>o</td><td>o</td> <td>`$\pi$`</td><td>\pi</td> </tr> <tr> <td>`$\rho$`</td><td>\rho</td> <td>`$\sigma$`</td><td>\sigma</td> <td>`$\tau$`</td><td>\tau</td> <td>`$\upsilon$`</td><td>\upsilon</td> </tr> <tr> <td>`$\phi$`</td><td>\phi</td> <td>`$\chi$`</td><td>\chi</td> <td>`$\psi$`</td><td>\psi</td> <td>`$\omega, \Omega$`</td><td>\omega, \Omega</td> </tr> <tr> <td>`$\Phi$`</td><td>\Phi</td> <td>`$\varphi$`</td><td>\varphi</td> <td>.</td><td>.</td> <td>.</td><td>.</td> </tr> <tr> <td>`$\Lambda$`</td><td>\Lambda</td> <td>`$\Delta$`</td><td>\Delta</td> <td>.</td><td>.</td> <td>.</td><td>.</td> </tr> </table> <h3>Operations</h3> <table> <tr> <td>`$\cdot$`</td><td>\cdot</td> <td>`$\oplus$`</td><td>\oplus</td> <td>`$\times$`</td><td>\times</td> <td>`$\nabla$`</td><td>\nabla</td> </tr> <tr> <td>`$\pm$`</td><td>\pm</td> <td>`$\mp$`</td><td>\mp</td> <td>`$\cup$`</td><td>\cup</td> <td>`$\cap$`</td><td>\cap</td> </tr> </table> <h3>Relations</h3> <table> <tr> <td>`$\approx$`</td><td>\approx</td> <td>`$\sim$`</td><td>\sim</td> <td>`$\cong$`</td><td>\cong</td> <td>`$\neq$`</td><td>\neq</td> </tr> </table> <h3>Calligraphic Letters</h3> <table> <tr> <td>`$\cal{O}$`</td><td>\cal{O}</td> <td>`$\mathfrak{M}$`</td><td>\mathfrak{O}</td> <td>`$\mathfrak{R}$`</td><td>\mathfrak{R}</td> </tr> </table> <h3>Sets</h3> <table> <tr> <td>`$\mathbb{N}$`</td><td>\mathbb{N}</td> <td>`$\mathbb{Z}$`</td><td>\mathbb{Z}</td> <td>`$\mathbb{R}$`</td><td>\mathbb{R}</td> <td>`$\mathbb{C}$`</td><td>\mathbb{C}</td> </tr> <tr> <td>`$\mathbb{A}$`</td><td>\mathbb{A}</td> <td>`$\cap$`</td><td>\cap</td> <td>`$\cup$`</td><td>\cup</td> <td>`$\in$`</td><td>\in</td> </tr> <tr> <td>`$\subseteq$`</td><td>\subseteq</td> <td>`$\subsetneq$`</td><td>\subsetneq</td> <td>`$\notin$`</td><td>\notin</td> <td>`$\bigcup$`</td><td>\bigcup</td> </tr> </table> <h3>Other</h3> <p>You might need \qed, \qedsymbol, \blacksquare for proofs. It is the <a href="http://en.wikipedia.org/wiki/Tombstone_(typography)">Tombstone</a> <code>$\blacksquare$</code></p> <p>I&#39;ve recently needed <code>$\dots, \ddots, \vdots$</code> (\dots, \ddots, \vdots) for a visualization in a matrix. Note that you can write ... instead of \dots, but you&#39;ll lose the semantics.</p> <h2>See also</h2> <ul> <li><a href="http://www.tex.ac.uk/tex-archive/info/symbols/comprehensive/symbols-a4.pdf">List of symbols</a> - 164 pages of symbols</li> <li><a href="http://en.wikipedia.org/wiki/Help:Displaying_a_formula">Displaying a formula</a></li> </ul> When is matrix multiplication commutative? http://martin-thoma.com/when-is-matrix-multiplication-commutative Sat, 14 Jul 2012 08:49:48 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/when-is-matrix-multiplication-commutative <p>Matrix multiplication in general is not commutative. Here is an example:</p> <p><code>$A, B \in R^{2 \times 2}$</code> <code>$A := \begin{pmatrix} 1 &amp; 2 \\ 3 &amp; 4 \end{pmatrix}$</code> <code>$B := \begin{pmatrix} 5 &amp; 6 \\ 7 &amp; 8 \end{pmatrix}$</code></p> <p><code>$A \cdot B = \begin{pmatrix} 19 &amp; 22 \\ 43 &amp; 50 \end{pmatrix} \neq \begin{pmatrix} 23 &amp; 34 \\ 31 &amp; 46 \end{pmatrix} = B \cdot A$</code></p> <h2>When is 2x2 matrix multiplication commutative?</h2> <p><code>$\begin{pmatrix} a &amp; b \\ c &amp; d \end{pmatrix} \cdot \begin{pmatrix} e &amp; f \\ g &amp; h \end{pmatrix} = \begin{pmatrix} ae + bg &amp; af + bh \\ ce + dg &amp; cf + dh \end{pmatrix}$</code></p> <p><code>$\begin{pmatrix} e &amp; f \\ g &amp; h \end{pmatrix} \cdot \begin{pmatrix} a &amp; b \\ c &amp; d \end{pmatrix} = \begin{pmatrix} ae + cf &amp; be + df \\ ag + ch &amp; bg + dh \end{pmatrix}$</code></p> <p>So you get four equations: <code>$\begin{eqnarray*} I) &amp; ae + bg &amp;= ae + cf &amp;\Leftrightarrow bg = cf \\ II) &amp; af + bh &amp;= be + df\\ III) &amp; ce + dg &amp;= ag + ch\\ IV) &amp; cf + dh &amp;= bg + dh &amp;\Leftrightarrow cf = bg \end{eqnarray*}$</code></p> <p>You might note that (I) is the same as (IV). So you have those equations: <code>$\begin{eqnarray*} I) &amp; bg = cf \\ II) &amp; af + bh &amp;= be + df &amp; \Leftrightarrow f (a - d) = b (e - h)\\ III) &amp; ce + dg &amp;= ag + ch &amp; \Leftrightarrow g (a - d) = c (e - h) \end{eqnarray*}$</code></p> <h3>Case #1: a != d and e != h</h3> <p><code>$\begin{eqnarray*} I) &amp; bg &amp;= cf \\ II) &amp; \frac{f}{g} &amp;= \frac{b}{c} \Leftrightarrow cf = bg \end{eqnarray*}$</code></p> <p>Now (I) and (II) are essentially the same. So we only demand that <code>$ bg = cf$</code> and <code>$a \neq d$</code> and <code>$e \neq h$</code> for commutative matrix multiplication of <code>$2 \times 2$</code> matrices.</p> <h3>Case #2.1: a == d</h3> <p><code>$\begin{eqnarray*} I) &amp; bg &amp;= cf \\ II) &amp; 0 &amp;= b (e - h)\\ III) &amp; 0 &amp;= c (e - h) \end{eqnarray*}$</code></p> <p>So you end up with: (<code>$e = h$</code> and <code>$bg = cf$</code>) or (<code>$b = c = 0$</code>)</p> <h3>Case #2.2: e == h</h3> <p><code>$\begin{eqnarray*} I) &amp; bg &amp;= cf \\ II) &amp; f (a - d) &amp;= 0\\ III) &amp; g (a - d) &amp;= 0 \end{eqnarray*}$</code></p> <p>So you end up with: (<code>$a = d$</code> and <code>$bg = cf$</code>) or (<code>$f = g = 0$</code>)</p> <h2>Special Cases</h2> <p>Matrix multiplication is always commutative if ... <ul> <li>... one matrix is the <a href="http://en.wikipedia.org/wiki/Identity_matrix">Identity matrix</a>.</li> <li>... one matrix is the <a href="http://en.wikipedia.org/wiki/Zero_matrix">Zero matrix</a>.</li> <li>... both matrices are <a href="http://en.wikipedia.org/wiki/Rotation_matrix">rotation matrices</a>. (basically case #2)</li> <li>... both matrices are <a href="http://en.wikipedia.org/wiki/Diagonal_matrix">Diagonal matrices</a>.</li> </ul></p> <h2>Simultaneous diagonalization</h2> <p>Two matrices <code>$A, B \in R^{n \times n}$</code> are called simultaneous diagonalizable <code>$: \Leftrightarrow$</code> one matrix <code>$S \in R^{n \times n}$</code> exists, such that <code>$D_A = S^{-1} \cdot A \cdot S$</code> and <code>$D_B = S^{-1} \cdot B \cdot S$</code> with <code>$D_A$</code> and <code>$D_B$</code> are diagonal matrices.</p> <p><strong>Statement</strong>: <code>$A, B \in \mathbb{R}^{n \times n}$</code> are simultaneous diagonalizable <code>$\Rightarrow A \cdot B = B \cdot A$</code> <strong>Proof</strong>: As A and B are simultaneous diagonalizable, a matrix <code>$T \in \mathbb{R}^{n \times n}$</code> exists, such that <code>$D_A = S^{-1} \cdot A \cdot S$</code> and <code>$D_B = S^{-1} \cdot B \cdot S$</code> with <code>$D_A$</code> and <code>$D_B$</code> are diagonal matrices.</p> <p><code>$ \begin{align} \Rightarrow A \cdot B &amp;= S \cdot D_A S^{-1} \cdot S \cdot D_B \cdot S^{-1} \\ &amp;= S \cdot D_A \cdot D_B \cdot S^{-1} \\ &amp;= S \cdot D_B \cdot D_A \cdot S^{-1} \\ &amp;= S \cdot D_B \cdot S^{-1} \cdot S \cdot D_A \cdot S^{-1} \\ &amp;= B \cdot A \blacksquare \end{align} $</code></p> <p><strong>Statement</strong>: <code>$A \cdot B = B \cdot A \nRightarrow A, B \in \mathbb{R}^{n \times n}$</code> are simultaneous diagonalizable. <strong>Proof</strong>: by Counter-Example <code>$\begin{pmatrix}0 &amp; 1 \\ 0 &amp; 0\end{pmatrix} \cdot \begin{pmatrix}1 &amp; 0 \\ 0 &amp; 1\end{pmatrix} = \begin{pmatrix}1 &amp; 0 \\ 0 &amp; 1\end{pmatrix} \cdot \begin{pmatrix}0 &amp; 1 \\ 0 &amp; 0\end{pmatrix}$</code>, but <code>$\begin{pmatrix}0 &amp; 1 \\ 0 &amp; 0\end{pmatrix}$</code> is not diagonalizable. <code>$\blacksquare$</code></p> <h2>See also</h2> <ul> <li><a href="http://math.stackexchange.com/q/170241/6876">When is matrix multiplication commutative?</a> on math.stackexchange.com</li> </ul> GOTO in Python, Java and C++ http://martin-thoma.com/goto-in-python-java-and-cpp Thu, 12 Jul 2012 20:04:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/goto-in-python-java-and-cpp <p><a href="http://en.wikipedia.org/wiki/Goto">GOTO</a> is a statement of the early beginnings of programming. It is rarely used in high-level code today. Code that makes use of it is called <a href="http://en.wikipedia.org/wiki/Spaghetti_code">Spaghetti code</a> by some people. I have almost never seen goto statements in code, so I&#39;ve been curious about them.</p> <div style="width: 533px" class="wp-caption aligncenter"><a href="../images/2012/07/xkcd-goto.png"><img src="../images/2012/07/xkcd-goto.png" alt="" width="533" height="145" class=" wp-image-30341 "/></a><p class="wp-caption-text"></p></div> <h2>Python</h2> <p>Python does NOT offer GOTO. However, somebody made a GOTO module for April Fools&#39; Day. See <a href="http://stackoverflow.com/q/6959360/562769"><code>goto</code> in Python</a> if you&#39;re still interested.</p> <h2>Java</h2> <blockquote>Java has no goto statement. Studies illustrated that goto is (mis)used more often than not simply "because it's there". Eliminating goto led to a simplification of the language--there are no rules about the effects of a goto into the middle of a for statement, for example. Studies on approximately 100,000 lines of C code determined that roughly 90 percent of the goto statements were used purely to obtain the effect of breaking out of nested loops. As mentioned above, multi-level break and continue remove most of the need for goto statements.</blockquote> <p>Source: <a href="http://java.sun.com/docs/white/langenv/Simple.doc2.html#5550">java.sun.com</a></p> <h2>C++</h2> <p>GOTO works in C++. Here is a minimal example:</p> <h3>Minimal Example</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="kt">int</span> <span class="n">test</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nl">start:</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">test</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span> <span class="k">goto</span> <span class="n">end</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">test</span> <span class="o">+=</span> <span class="mi">7</span><span class="p">;</span> <span class="k">goto</span> <span class="n">start</span><span class="p">;</span> <span class="p">}</span> <span class="nl">end:</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;test: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">test</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash"><span class="nb">test</span>: 14 </code></pre></div> <h3>Euclidean GCD algorithm</h3> <p>Most of you might know the <a href="http://en.wikipedia.org/wiki/Euclidean_algorithm">euclidean algorithm</a> for calculating the greatest common divisor in a version like this one:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">euclidGCD</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">while</span> <span class="p">(</span><span class="n">b</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">;</span> <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span> <span class="n">b</span> <span class="o">=</span> <span class="n">m</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">a</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="c1">// Outputs 20</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;GCD of 340 and 32760: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">euclidGCD</span><span class="p">(</span><span class="mi">340</span><span class="p">,</span> <span class="mi">32760</span><span class="p">)</span> <span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Here is a goto-version that works perfectly fine:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">euclidGCD</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">b</span> <span class="o">&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="k">goto</span> <span class="n">b_larger</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">a</span> <span class="o">=</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">b</span><span class="p">;</span> <span class="nl">b_larger:</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span> <span class="o">%</span> <span class="n">a</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">a</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;GCD of 340 and 32760: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">euclidGCD</span><span class="p">(</span><span class="mi">340</span><span class="p">,</span> <span class="mi">32760</span><span class="p">)</span> <span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Source: <a href="http://en.literateprograms.org/Euclidean_algorithm_(C)">literateprograms.org</a></p> <h3>Try bad things</h3> <p>You can&#39;t jump into a function:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">myFunction</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="nl">inFunctionLabel:</span><span class="p">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">return</span> <span class="n">i</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="kt">int</span> <span class="n">test</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">goto</span> <span class="n">inFunctionLabel</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;test: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">test</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Compiler error:</p> <div class="highlight"><pre><code class="bash">gotoExample.cpp: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>int myFunction<span class="o">(</span>int<span class="o">)</span><span class="p">&amp;</span>rsquo<span class="p">;</span>: gotoExample.cpp:7: warning: label <span class="p">&amp;</span>lsquo<span class="p">;</span>inFunctionLabel<span class="p">&amp;</span>rsquo<span class="p">;</span> defined but not used gotoExample.cpp: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>int main<span class="o">()</span><span class="p">&amp;</span>rsquo<span class="p">;</span>: gotoExample.cpp:15: error: label <span class="p">&amp;</span>lsquo<span class="p">;</span>inFunctionLabel<span class="p">&amp;</span>rsquo<span class="p">;</span> used but not defined </code></pre></div> <p>So goto is at least bound to its scope.</p> Java Puzzle #1: Pre- and Postincrement http://martin-thoma.com/java-puzzle-1-pre-and-postincrement Wed, 11 Jul 2012 14:07:02 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/java-puzzle-1-pre-and-postincrement <h2>The puzzle</h2> <p>What is the output of the following piece of code?</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="o">++</span><span class="n">i</span> <span class="o">+</span> <span class="n">i</span><span class="o">++</span> <span class="o">+</span> <span class="o">++</span><span class="n">i</span><span class="o">;</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">j</span> <span class="o">+=</span> <span class="o">++</span><span class="n">j</span> <span class="o">+</span> <span class="n">j</span><span class="o">++</span> <span class="o">+</span> <span class="o">++</span><span class="n">j</span><span class="o">;</span> <span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">k</span> <span class="o">+=</span> <span class="n">k</span><span class="o">++</span> <span class="o">+</span> <span class="n">k</span><span class="o">++</span> <span class="o">+</span> <span class="o">++</span><span class="n">k</span><span class="o">;</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;i = &quot;</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;j = &quot;</span> <span class="o">+</span> <span class="n">j</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;k = &quot;</span> <span class="o">+</span> <span class="n">k</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;m = &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">m</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <p>The output is:</p> <div class="highlight"><pre><code class="bash"><span class="nv">i</span> <span class="o">=</span> 9 <span class="nv">j</span> <span class="o">=</span> 9 <span class="nv">k</span> <span class="o">=</span> 8 <span class="nv">m</span> <span class="o">=</span> 2 </code></pre></div> <h2>Explanation</h2> <h3>Part one</h3> <p>First, take a look at statements of this structure:</p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">+=</span> <span class="n">s</span> </code></pre></div> <p>where <code>i</code> is the integer and s is a statement (e.g. <code>++i</code>). This gets evaluated to </p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">s</span> </code></pre></div> <p>Source: <a href="http://wordpress.org/extend/plugins/embed-github-gist/">docs.oracle.com</a></p> <h3>Part two</h3> <p>Lets take a look at pre- and postincrement in Java.</p> <p>You can quite easily figure out what the different increments do by this snippet:</p> <div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;i = &quot;</span> <span class="o">+</span> <span class="o">++</span><span class="n">i</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;i = &quot;</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;j = &quot;</span> <span class="o">+</span> <span class="n">j</span><span class="o">++);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;j = &quot;</span> <span class="o">+</span> <span class="n">j</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;k = &quot;</span> <span class="o">+</span> <span class="o">(</span><span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">));</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash"><span class="nv">i</span> <span class="o">=</span> 1 <span class="nv">i</span> <span class="o">=</span> 1 <span class="nv">j</span> <span class="o">=</span> 0 <span class="nv">j</span> <span class="o">=</span> 1 <span class="nv">k</span> <span class="o">=</span> 1 </code></pre></div> <p>Line 7 adds +1 to <code>i</code> and returns the value. Line 10 returns the value of <code>j</code> and adds +1 to <code>j</code>. Line 13 adds +1 to <code>k</code> and returns <code>k</code>.</p> <p>Lets return to the original puzzle. Java parses your code from left to right (<a href="http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html">Source 1</a>, <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.1">Source 2</a>).</p> <p>Most important: <blockquote>Evaluation of an expression can also produce side effects, because expressions may contain embedded assignments, increment operators, decrement operators, and method invocations.</blockquote></p> <p>So:</p> <div class="highlight"><pre><code class="java"><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="o">++</span><span class="n">i</span> <span class="o">+</span> <span class="n">i</span><span class="o">++</span> <span class="o">+</span> <span class="o">++</span><span class="n">i</span><span class="o">;</span> </code></pre></div> <p>is the same as</p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">=</span> <span class="o">((</span><span class="n">i</span> <span class="o">+</span> <span class="o">(++</span><span class="n">i</span><span class="o">))</span> <span class="o">+</span> <span class="o">(</span><span class="n">i</span><span class="o">++))</span> <span class="o">+</span> <span class="o">(++</span><span class="n">i</span><span class="o">);</span> </code></pre></div> <p>The first <code>++i</code> increments <code>i</code> to 2 and returns 2. So you have:</p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">i</span> <span class="o">=</span> <span class="o">((</span><span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="o">(</span><span class="n">i</span><span class="o">++))</span> <span class="o">+</span> <span class="o">(++</span><span class="n">i</span><span class="o">);</span> </code></pre></div> <p>The <code>i++</code> returns 2, as it is the new value of <code>i</code>, and increments <code>i</code> to 3:</p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">i</span> <span class="o">=</span> <span class="o">((</span><span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="o">++</span><span class="n">i</span><span class="o">;</span> </code></pre></div> <p>The second <code>++i</code> increments <code>i</code> to 4 and returns 4:</p> <div class="highlight"><pre><code class="java"><span class="n">i</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="o">((</span><span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="mi">2</span><span class="o">)</span> <span class="o">+</span> <span class="mi">4</span><span class="o">;</span> </code></pre></div> <p>So you end up with <code>9</code>.</p> <p>A <a href="http://en.wikipedia.org/wiki/Parse_tree">parse tree</a> of this evaluation would look like this: <div style="width: 454px" class="wp-caption aligncenter"><a href="../images/2012/07/evaluation-tree.gif"><img src="../images/2012/07/evaluation-tree.gif" alt="" width="454" height="638" class="size-full wp-image-30711"/></a><p class="wp-caption-text"></p></div></p> <p>The explanation for the other three ones is similar.</p> <h2>See also</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Increment_and_decrement_operators">Increment and decrement operators</a></li> <li><a href="http://stackoverflow.com/q/971312/562769">Why avoid increment (&ldquo;++&rdquo;) and decrement (&ldquo;--&rdquo;) operators in JavaScript?</a></li> <li><a href="http://stackoverflow.com/q/11431914/562769">Pre- and postincrement in Java</a></li> </ul> What is a fractal? http://martin-thoma.com/what-is-a-fractal Sat, 07 Jul 2012 17:00:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-is-a-fractal <blockquote>[...] Fractals are typically self-similar patterns, where self-similar means they are "the same from near as from far". [...] The definition of fractal goes beyond self-similarity per se to exclude trivial self-similarity and include the idea of a detailed pattern repeating itself.</blockquote> <p>Source: <a href="http://en.wikipedia.org/wiki/Fractal">Fractal</a>, Wikipedia</p> <h2>Examples</h2> <p>The <a href="http://en.wikipedia.org/wiki/Rensselaer_Polytechnic_Institute">Rensselaer Polytechnic Institute</a> made an <a href="http://www.ccd.rpi.edu/eglash/temp/CS%20RPI/Chapter%201.2.html">applet</a> which allows you to create fractals by yourself. So I&#39;ve tried this one as a starter: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/martin-fractal-1-300x57.png"><img src="../images/2012/07/martin-fractal-1-300x57.png" alt="" width="300" height="57" class="size-medium wp-image-29991"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/martin-fractal-2-300x63.png"><img src="../images/2012/07/martin-fractal-2-300x63.png" alt="" width="300" height="63" class="size-medium wp-image-30001"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/martin-fractal-3-300x65.png"><img src="../images/2012/07/martin-fractal-3-300x65.png" alt="" width="300" height="65" class="size-medium wp-image-30011"/></a><p class="wp-caption-text"></p></div></p> <p>You might know this one: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/schnee-fractal-1-300x71.png"><img src="../images/2012/07/schnee-fractal-1-300x71.png" alt="" width="300" height="71" class="size-medium wp-image-30031"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/schnee-fractal-2-300x72.png"><img src="../images/2012/07/schnee-fractal-2-300x72.png" alt="" width="300" height="72" class="size-medium wp-image-30041"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/schnee-fractal-3-300x71.png"><img src="../images/2012/07/schnee-fractal-3-300x71.png" alt="" width="300" height="71" class="size-medium wp-image-30051"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/schnee-fractal-4-300x72.png"><img src="../images/2012/07/schnee-fractal-4-300x72.png" alt="" width="300" height="72" class="size-medium wp-image-30061"/></a><p class="wp-caption-text"></p></div> <h2>Fractals in Nature</h2> <p>Fractals seem to appear quite often in nature. I have just re-created one that I have seen recently: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractal-1-300x163.png"><img src="../images/2012/07/leaf-fractal-1-300x163.png" alt="" width="300" height="163" class="size-medium wp-image-30081"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractal-2-300x162.png"><img src="../images/2012/07/leaf-fractal-2-300x162.png" alt="" width="300" height="162" class="size-medium wp-image-30091"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractal-3-300x165.png"><img src="../images/2012/07/leaf-fractal-3-300x165.png" alt="" width="300" height="165" class="size-medium wp-image-30101"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractal-4-300x156.png"><img src="../images/2012/07/leaf-fractal-4-300x156.png" alt="" width="300" height="156" class="size-medium wp-image-30111"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractals-5-300x147.png"><img src="../images/2012/07/leaf-fractals-5-300x147.png" alt="" width="300" height="147" class="size-medium wp-image-30121"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractals-6-300x157.png"><img src="../images/2012/07/leaf-fractals-6-300x157.png" alt="" width="300" height="157" class="size-medium wp-image-30131"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/07/leaf-fractals-9-300x155.png"><img src="../images/2012/07/leaf-fractals-9-300x155.png" alt="" width="300" height="155" class="size-medium wp-image-30141"/></a><p class="wp-caption-text"></p></div> <h2>Mandelbrot set</h2> <p>The <a href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot set</a> is maybe the best known fractal, although it is not a fractal in my opinion. It does never repeat itself.</p> <iframe width="512" height="288" src="http://www.youtube.com/embed/1o5FMTHkLQg" frameborder="0" allowfullscreen></iframe> <h2>See also</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Fractal">Fractal</a></li> <li>Mandelbrot set</li> <li><a href="http://www.acm.uiuc.edu/~troys2/tutorials/FractalTreeReel2.swf">Visualization of a fractal</a></li> <li>TED Talk: <a href="http://www.ted.com/talks/lang/en/ron_eglash_on_african_fractals.html">Ron Eglash on African fractals</a></li> </ul> My LaTeX Tikz Template http://martin-thoma.com/my-latex-tikz-template Sat, 07 Jul 2012 15:38:13 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/my-latex-tikz-template <p>Sometimes I would like to create a single picture with Tikz for later usage on Wikipedia or my Blog. This is my LaTeX Tikz template I use in such a situation:</p> <h2>The templates</h2> <h3>latex-document.tex</h3> <div class="highlight"><pre><code class="text">\documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tikz} \usetikzlibrary{arrows,positioning} \begin{document} \begin{tikzpicture} % Your Codes should be here \end{tikzpicture} \end{document} </code></pre></div> <h4>Standalone</h4> <h4>Preview-Environment</h4> <div class="highlight"><pre><code class="text">\documentclass{article} \usepackage[pdftex,active,tightpage]{preview} \setlength\PreviewBorder{2mm} \usepackage{tikz} \usetikzlibrary{arrows,positioning} \begin{document} \begin{preview} \begin{tikzpicture} % Your Codes should be here \end{tikzpicture} \end{preview} \end{document} </code></pre></div> <h3>Makefile</h3> <div class="highlight"><pre><code class="text">SOURCE = latex-document.tex DELAY = 80 DENSITY = 300 make: pdflatex `$(SOURCE).tex -output-format=pdf make clean clean: rm -rf $`(TARGET) *.class *.html *.log *.aux animatedGif: pdfcrop `$(SOURCE).pdf convert -verbose -delay $`(DELAY) -loop 0 -density `$(DENSITY) $`(SOURCE)-crop.pdf `$(SOURCE).gif make clean transparentGif: convert $`(SOURCE).pdf -transparent white result.gif make clean svg: pdf2svg `$(SOURCE).pdf $`(SOURCE).svg # Necessary, as pdf2svg does not always create valid svgs: inkscape `$(SOURCE).svg --export-plain-svg=$`(SOURCE).svg # Alternatively, only this one (produces worse results): #inkscape `$(SOURCE).pdf --export-plain-svg=$`(SOURCE).svg </code></pre></div> <h2>Requirements</h2> <ul> <li>LaTeX (<a href="../how-to-install-the-latest-latex-version/" title="How to install the latest LaTeX Version">How to install the latest LaTeX Version</a>)</li> <li>make</li> <li>Inkscape</li> <li>pdf2svg</li> </ul> <h2>Test if you meet these requirements</h2> <p>Make sure that you have a valid LaTeX installation. <code>pdflatex --version</code> should output something like:</p> <div class="highlight"><pre><code class="bash">pdfTeX 3.1415926-2.3-1.40.12 <span class="o">(</span>TeX Live 2011<span class="o">)</span> kpathsea version 6.0.1 Copyright 2011 Peter Breitenlohner <span class="o">(</span>eTeX<span class="o">)</span>/Han The Thanh <span class="o">(</span>pdfTeX<span class="o">)</span>. There is NO warranty. Redistribution of this software is covered by the terms of both the pdfTeX copyright and the Lesser GNU General Public License. For more information about these matters, see the file named COPYING and the pdfTeX source. Primary author of pdfTeX: Peter Breitenlohner <span class="o">(</span>eTeX<span class="o">)</span>/Han The Thanh <span class="o">(</span>pdfTeX<span class="o">)</span>. Compiled with libpng 1.5.2<span class="p">;</span> using libpng 1.5.2 Compiled with zlib 1.2.5<span class="p">;</span> using zlib 1.2.5 Compiled with xpdf version 3.02pl5 </code></pre></div> <p>Make sure you can execute Makefiles. <code>make --version</code> should output something like this:</p> <div class="highlight"><pre><code class="bash">GNU Make 3.81 Copyright <span class="o">(</span>C<span class="o">)</span> 2006 Free Software Foundation, Inc. This is free software<span class="p">;</span> see the <span class="nb">source </span><span class="k">for </span>copying conditions. There is NO warranty<span class="p">;</span> not even <span class="k">for </span>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built <span class="k">for </span>i486-pc-linux-gnu </code></pre></div> <p>The command <code>inkscape --version</code> should return:</p> <div class="highlight"><pre><code class="bash">Inkscape 0.47 r22583 <span class="o">(</span>Apr 4 2010<span class="o">)</span> </code></pre></div> <p>And <code>pdf2svg --version</code> should return:</p> <div class="highlight"><pre><code class="bash">Usage: pdf2svg &lt;in file.pdf&gt; &lt;out file.svg&gt; <span class="o">[</span>&lt;page no&gt;<span class="o">]</span> </code></pre></div> <h2>How to use it</h2> <p>You have to place the Makefile in the same folder as latex-document.tex. If you have done this and if you meet the requirements, you can execute: <ul> <li><code>make</code>: Generates a PDF file from latex-document.tex</li> <li><code>make svg</code>: Generates a SVG file from the generated PDF file</li> <li><code>make transparentGif</code>: Generates a transparent Gif from the PDF file</li> <li><code>make animatedGif</code>: If you have used multiple slides, this will create an animated Gif file. See <a href="../how-to-visualize-graph-algorithms-with-latex/" title="How to visualize Graph algorithms with LaTeX">How to visualize Graph algorithms with LaTeX</a> for an example.</li> </ul></p> <h2>See also</h2> <ul> <li><a href="../how-to-print-source-code-with-latex/" title="How to print Source Code with LaTeX">How to print Source Code with LaTeX</a></li> <li><a href="../briefe-mit-latex-schreiben/" title="Briefe mit LaTeX schreiben">Briefe mit LaTeX schreiben</a> (A template for letters)</li> <li><a href="../plotting-function-graphs-with-latex/" title="Plotting function graphs with LaTeX">Plotting function graphs with LaTeX</a></li> </ul> C++ Operator overloading http://martin-thoma.com/cpp-operator-overloading Fri, 06 Jul 2012 14:00:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/cpp-operator-overloading <p>Operator overloading is heavily used in math. One of the most famous examples I know is &quot;+&quot;. If you add two elements from <code>$\mathbb{N}$</code> you will use the same character &quot;+&quot; as you use for adding two numbers from <code>$\mathbb{R}$</code>. You even use the plus-sign if you add matrices (which is obviously something different than adding single numbers).</p> <p>In some programming languages, like C++, you can overload operators by yourself.</p> <h2>First simple example</h2> <p>Imagine you wanted to store some data - lets say the prename, surname and age - about people you know. This could be done in a <code>struct</code>. After you&#39;ve stored it, you would like to print this information. Obviously, you don&#39;t want to do something like this:</p> <div class="highlight"><pre><code class="cpp"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Person(&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">prename</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">surname</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;, &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">age</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;)&quot;</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>If you wanted to print this information more than one time, you would have to add this long line every time.</p> <p>A <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()">toString()</a> method like the one Java uses would be nice. In C++, you don&#39;t have toString, but you can overload the <code>&lt;&lt;</code> operator!</p> <p>This is how it works:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="n">person</span> <span class="p">{</span> <span class="c1">// attributes</span> <span class="n">string</span> <span class="n">prename</span><span class="p">;</span> <span class="n">string</span> <span class="n">surname</span><span class="p">;</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span> <span class="c1">// constructor</span> <span class="n">person</span><span class="p">(</span><span class="n">string</span> <span class="n">p</span><span class="p">,</span> <span class="n">string</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">age</span><span class="p">)</span> <span class="o">:</span> <span class="n">prename</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">surname</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">age</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="p">{}</span> <span class="p">}</span> <span class="n">Person</span><span class="p">;</span> <span class="c1">// &quot;toString&quot; for C++</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">strm</span><span class="p">,</span> <span class="k">const</span> <span class="n">person</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">strm</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Person(&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">prename</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">surname</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;, &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">age</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;)&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">(){</span> <span class="n">Person</span> <span class="n">Martin</span> <span class="p">(</span><span class="s">&quot;Martin&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">Andreas</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiOld</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiYoung</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">myArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">Martin</span><span class="p">,</span> <span class="n">Andreas</span><span class="p">,</span> <span class="n">AndiOld</span><span class="p">,</span> <span class="n">AndiYoung</span><span class="p">};</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Sorting</h2> <p>You can sort by overloading <code>&lt;</code>. You can use a sort by adding </p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;algorithm&gt;</span> </code></pre></div> <p>to your program and using <code>sort(array, array + elements);</code></p> <p>This is how it looks like:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;algorithm&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="n">person</span> <span class="p">{</span> <span class="c1">// attributes</span> <span class="n">string</span> <span class="n">prename</span><span class="p">;</span> <span class="n">string</span> <span class="n">surname</span><span class="p">;</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span> <span class="c1">// constructor</span> <span class="n">person</span><span class="p">(</span><span class="n">string</span> <span class="n">p</span><span class="p">,</span> <span class="n">string</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">age</span><span class="p">)</span> <span class="o">:</span> <span class="n">prename</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">surname</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">age</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="p">{}</span> <span class="p">}</span> <span class="n">Person</span><span class="p">;</span> <span class="c1">// &quot;.equals()&quot; for C++</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Person</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Person</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">b</span><span class="p">){</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">prename</span> <span class="o">==</span> <span class="n">b</span><span class="p">.</span><span class="n">prename</span><span class="p">))</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">prename</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">prename</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">surname</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">surname</span><span class="p">))</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">surname</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">surname</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">age</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">age</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">// &quot;toString&quot; for C++</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">strm</span><span class="p">,</span> <span class="k">const</span> <span class="n">person</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">strm</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Person(&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">prename</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">surname</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;, &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">age</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;)&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">(){</span> <span class="n">Person</span> <span class="n">Martin</span> <span class="p">(</span><span class="s">&quot;Martin&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">Andreas</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiOld</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiYoung</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">myArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">Martin</span><span class="p">,</span> <span class="n">Andreas</span><span class="p">,</span> <span class="n">AndiOld</span><span class="p">,</span> <span class="n">AndiYoung</span><span class="p">};</span> <span class="n">sort</span><span class="p">(</span><span class="n">myArray</span><span class="p">,</span> <span class="n">myArray</span> <span class="o">+</span> <span class="mi">4</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>By the way, if you don&#39;t define <code>&lt;</code> you get something like this:</p> <div class="highlight"><pre><code class="cpp"><span class="n">In</span> <span class="n">file</span> <span class="n">included</span> <span class="n">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">algorithm</span><span class="o">:</span><span class="mi">62</span><span class="p">,</span> <span class="n">from</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">2</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">const</span> <span class="n">_Tp</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">__median</span><span class="p">(</span><span class="k">const</span> <span class="n">_Tp</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;,</span> <span class="k">const</span> <span class="n">_Tp</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;,</span> <span class="k">const</span> <span class="n">_Tp</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2268</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__introsort_loop</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Size</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Size</span> <span class="o">=</span> <span class="kt">int</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5220</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">89</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__a</span> <span class="o">&lt;</span> <span class="n">__b</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">90</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__b</span> <span class="o">&lt;</span> <span class="n">__c</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">92</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__a</span> <span class="o">&lt;</span> <span class="n">__c</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">96</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__a</span> <span class="o">&lt;</span> <span class="n">__c</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">98</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__b</span> <span class="o">&lt;</span> <span class="n">__c</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">_RandomAccessIterator</span> <span class="n">std</span><span class="o">::</span><span class="n">__unguarded_partition</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Tp</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2268</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__introsort_loop</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Size</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Size</span> <span class="o">=</span> <span class="kt">int</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5220</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2209</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="o">*</span> <span class="n">__first</span> <span class="o">&lt;</span> <span class="n">__pivot</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2212</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__pivot</span> <span class="o">&lt;</span> <span class="o">*</span> <span class="n">__last</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__insertion_sort</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2178</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__final_insertion_sort</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5222</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2106</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__val</span> <span class="o">&lt;</span> <span class="o">*</span> <span class="n">__first</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__heap_select</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5067</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">partial_sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2256</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__introsort_loop</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Size</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Size</span> <span class="o">=</span> <span class="kt">int</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5220</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">1906</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="o">*</span> <span class="n">__i</span> <span class="o">&lt;</span> <span class="o">*</span> <span class="n">__first</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__unguarded_linear_insert</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Tp</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2112</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__insertion_sort</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2178</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__final_insertion_sort</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5222</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2067</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="n">__val</span> <span class="o">&lt;</span> <span class="o">*</span> <span class="n">__next</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">In</span> <span class="n">file</span> <span class="n">included</span> <span class="n">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">62</span><span class="p">,</span> <span class="n">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">algorithm</span><span class="o">:</span><span class="mi">62</span><span class="p">,</span> <span class="n">from</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">2</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__adjust_heap</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Tp</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Distance</span> <span class="o">=</span> <span class="kt">int</span><span class="p">,</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">394</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">make_heap</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">1904</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__heap_select</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5067</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">partial_sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2256</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__introsort_loop</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Size</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Size</span> <span class="o">=</span> <span class="kt">int</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5220</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">232</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="o">*</span><span class="p">(</span><span class="n">__first</span> <span class="o">+</span> <span class="p">((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)(((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">__secondChild</span><span class="p">)</span> <span class="o">*</span> <span class="mi">12u</span><span class="p">)))</span> <span class="o">&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">__first</span> <span class="o">+</span> <span class="p">((((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">__secondChild</span><span class="p">)</span> <span class="o">+</span> <span class="mh">0xffffffffffffffffffffffffffffffffu</span><span class="p">)</span> <span class="o">*</span> <span class="mi">12u</span><span class="p">))</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span> <span class="n">In</span> <span class="n">function</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__push_heap</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Tp</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Distance</span> <span class="o">=</span> <span class="kt">int</span><span class="p">,</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span><span class="o">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">244</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__adjust_heap</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Distance</span><span class="p">,</span> <span class="n">_Tp</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Distance</span> <span class="o">=</span> <span class="kt">int</span><span class="p">,</span> <span class="n">_Tp</span> <span class="o">=</span> <span class="n">person</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">394</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">make_heap</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">1904</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__heap_select</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5067</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">partial_sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">2256</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">__introsort_loop</span><span class="p">(</span><span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_RandomAccessIterator</span><span class="p">,</span> <span class="n">_Size</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RandomAccessIterator</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">,</span> <span class="n">_Size</span> <span class="o">=</span> <span class="kt">int</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_algo</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">5220</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">void</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">_RAIter</span><span class="p">,</span> <span class="n">_RAIter</span><span class="p">)</span> <span class="p">[</span><span class="n">with</span> <span class="n">_RAIter</span> <span class="o">=</span> <span class="n">Person</span><span class="o">*</span><span class="p">]</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">instantiated</span> <span class="n">from</span> <span class="n">here</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">include</span><span class="o">/</span><span class="n">c</span><span class="o">++/</span><span class="mf">4.4</span><span class="o">/</span><span class="n">bits</span><span class="o">/</span><span class="n">stl_heap</span><span class="p">.</span><span class="n">h</span><span class="o">:</span><span class="mi">134</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">no</span> <span class="n">match</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="k">operator</span><span class="o">&lt;&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="o">*</span><span class="p">(</span><span class="n">__first</span> <span class="o">+</span> <span class="p">((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)(((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">__parent</span><span class="p">)</span> <span class="o">*</span> <span class="mi">12u</span><span class="p">)))</span> <span class="o">&lt;</span> <span class="n">__value</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> </code></pre></div> <h2>Equality</h2> <p>You can also define <code>==</code> for your structs.</p> <p>I know this example does NOT make any sense. But it is an example you can work with:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="n">person</span> <span class="p">{</span> <span class="c1">// attributes</span> <span class="n">string</span> <span class="n">prename</span><span class="p">;</span> <span class="n">string</span> <span class="n">surname</span><span class="p">;</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span> <span class="c1">// constructor</span> <span class="n">person</span><span class="p">(</span><span class="n">string</span> <span class="n">p</span><span class="p">,</span> <span class="n">string</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">age</span><span class="p">)</span> <span class="o">:</span> <span class="n">prename</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">surname</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">age</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="p">{}</span> <span class="p">}</span> <span class="n">Person</span><span class="p">;</span> <span class="c1">// &quot;comperator&quot; for C++</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span><span class="p">(</span><span class="k">const</span> <span class="n">Person</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Person</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">b</span><span class="p">){</span> <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">age</span> <span class="o">==</span> <span class="mi">30</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">(){</span> <span class="n">Person</span> <span class="n">Martin</span> <span class="p">(</span><span class="s">&quot;Martin&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">Andreas</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiOld</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span> <span class="n">Person</span> <span class="nf">AndiYoung</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">myArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">Martin</span><span class="p">,</span> <span class="n">Andreas</span><span class="p">,</span> <span class="n">AndiOld</span><span class="p">,</span> <span class="n">AndiYoung</span><span class="p">};</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Casting</h2> <p>You can also define casts:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="n">person</span> <span class="p">{</span> <span class="c1">// attributes</span> <span class="n">string</span> <span class="n">prename</span><span class="p">;</span> <span class="n">string</span> <span class="n">surname</span><span class="p">;</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span> <span class="c1">// constructor</span> <span class="n">person</span><span class="p">(</span><span class="n">string</span> <span class="n">p</span><span class="p">,</span> <span class="n">string</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">age</span><span class="p">)</span> <span class="o">:</span> <span class="n">prename</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">surname</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">age</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="p">{}</span> <span class="c1">// prefix</span> <span class="k">operator</span> <span class="kt">int</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">age</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">Person</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="n">Person</span> <span class="n">Martin</span> <span class="p">(</span><span class="s">&quot;Martin&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">Andreas</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Thoma&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">AndiOld</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span> <span class="n">Person</span> <span class="n">AndiYoung</span> <span class="p">(</span><span class="s">&quot;Andreas&quot;</span><span class="p">,</span> <span class="s">&quot;Berger&quot;</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span> <span class="n">Person</span> <span class="n">myArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">Martin</span><span class="p">,</span> <span class="n">Andreas</span><span class="p">,</span> <span class="n">AndiOld</span><span class="p">,</span> <span class="n">AndiYoung</span><span class="p">};</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="kt">int</span><span class="p">(</span><span class="n">myArray</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Adding new operators</h2> <p>I like Python very much. Python allows me to get the power of a number like this:</p> <div class="highlight"><pre><code class="python"><span class="n">a</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">10</span> <span class="c"># 1024</span> </code></pre></div> <p>Lets try it for C++: <h3>Doesn&#39;t work</h3></p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="c1">// does NOT work</span> <span class="c1">// operators.cpp:7: error: expected initializer before &amp;lsquo;*&amp;rsquo; token</span> <span class="kt">int</span> <span class="k">operator</span><span class="o">**</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">){</span> <span class="kt">int</span> <span class="n">power</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">power</span> <span class="o">*=</span> <span class="n">a</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">power</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">(){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="o">**</span><span class="mi">10</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>I guess it doesn&#39;t work as it would be very difficult to distinguish something like this:</p> <div class="highlight"><pre><code class="cpp"><span class="n">a</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="o">*</span><span class="n">b</span><span class="p">;</span> <span class="n">a</span> <span class="o">=</span> <span class="n">a</span> <span class="o">**</span> <span class="n">b</span><span class="p">;</span> </code></pre></div> <p>If you try to use a <code>`$</code> you get:</p> <div class="highlight"><pre><code class="cpp"><span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">16</span><span class="o">:</span><span class="mi">13</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">invalid</span> <span class="n">suffix</span> <span class="s">&quot;$`10&quot;</span> <span class="n">on</span> <span class="n">integer</span> <span class="n">constant</span> </code></pre></div> <p>If you try to use a <code>&sect;</code> you get:</p> <div class="highlight"><pre><code class="cpp"><span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">7</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">stray</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="err">\</span><span class="mi">302</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="n">program</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">7</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">stray</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="err">\</span><span class="mi">247</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="n">program</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">16</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">stray</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="err">\</span><span class="mi">302</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="n">program</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">16</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">stray</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="err">\</span><span class="mi">247</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">in</span> <span class="n">program</span> <span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">7</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="n">expected</span> <span class="n">type</span><span class="o">-</span><span class="n">specifier</span> <span class="n">before</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;(</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">token</span> </code></pre></div> <p>You are also not allowed to redefine <code>*</code>:</p> <div class="highlight"><pre><code class="cpp"><span class="n">operators</span><span class="p">.</span><span class="n">cpp</span><span class="o">:</span><span class="mi">7</span><span class="o">:</span> <span class="n">error</span><span class="o">:</span> <span class="o">&amp;</span><span class="n">lsquo</span><span class="p">;</span><span class="kt">int</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span><span class="o">&amp;</span><span class="n">rsquo</span><span class="p">;</span> <span class="n">must</span> <span class="n">have</span> <span class="n">an</span> <span class="n">argument</span> <span class="n">of</span> <span class="k">class</span> <span class="nc">or</span> <span class="n">enumerated</span> <span class="n">type</span> </code></pre></div> <h3>Works</h3> <p>You can wrap the integer like this:</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="n">integer</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">inner</span><span class="p">;</span> <span class="c1">// constructor</span> <span class="n">integer</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="o">:</span> <span class="n">inner</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">{}</span> <span class="p">}</span> <span class="n">Integer</span><span class="p">;</span> <span class="kt">int</span> <span class="k">operator</span><span class="o">^</span><span class="p">(</span><span class="n">Integer</span> <span class="n">a</span><span class="p">,</span> <span class="n">Integer</span> <span class="n">b</span><span class="p">){</span> <span class="kt">int</span> <span class="n">power</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">inner</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">power</span> <span class="o">*=</span> <span class="n">a</span><span class="p">.</span><span class="n">inner</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="n">power</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span><span class="p">(){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">Integer</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">^</span><span class="n">Integer</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// outputs 1024</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <ul> <li>A class for <a href="../fractions-in-cpp/">dealing with fractions</a> - which includes 7 examples for operator overloading</li> <li><a href="http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B">Operators in C and C++</a></li> <li><a href="http://stackoverflow.com/a/4421715/562769">The General Syntax of operator overloading in C++</a>. sbi, Stack Overflow.</li> <li><a href="http://stackoverflow.com/a/4421708/562769">The Three Basic Rules of Operator Overloading in C++</a>. sbi, Stack Overflow.</li> <li><a href="http://www.cplusplus.com/doc/tutorial/classes2/">Overloading operators</a>. C++-Reference.</li> </ul> Mathe Puzzle #1: Verschleierung http://martin-thoma.com/mathe-puzzle-1-verschleierung Wed, 04 Jul 2012 18:54:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/mathe-puzzle-1-verschleierung <p><strong>Die folgende Funktion ist sehr bekannt. Wie lautet ihr Name?</strong></p> <p>Seien <code>$\oplus, \otimes: \mathbb{R} \times \mathbb{R} \rightarrow \mathbb{R}$</code> Verkn&uuml;fungen auf <code>$\mathbb{R}$</code> und definiert durch: <code>$\oplus(a, b) := a + b$</code> <code>$\otimes(a, b) := a - b$</code></p> <p>Sei <code>$O:\mathbb{N} \rightarrow \mathbb{R}$</code> eine Abbildung und definiert durch <code>$O(0) := 0, O(0^0) := 0^0, O(o) := O(o \otimes 0^0) \oplus O(o \otimes 0^0 \otimes 0^0)$</code>.</p> <p>. . . . . . .</p> <p>Aufl&ouml;sung gibts weiter unten - die Abbildung ist wirklich sehr bekannt :-)</p> <p>. . . . . . . . . . . . . . . . . . . .</p> <p>Schreiben wir das doch mal um. Wenn wir schon die normale Addition bzw. Subtraktion des K&ouml;rpers <code>$\mathbb{R}$</code> benutzen, k&ouml;nnen wir auch die gewohnten Symbole verwenden: <code>$O:\mathbb{N} \rightarrow \mathbb{R}$</code> <code>$O(0) := 0, O(0^0) := 0^0, O(o) := O(o - 0^0) + O(o - 0^0 - 0^0)$</code></p> <p>Nun sind wir es gewohnt, dass die Funktionen <code>$f$</code> hei&szlig;en und die Variablen x: <code>$f:\mathbb{N} \rightarrow \mathbb{R}$</code> <code>$f(0) := 0, f(0^0) := 0^0, f(x) := f(x - 0^0) + f(x - 0^0 - 0^0)$</code></p> <p>Au&szlig;erdem ist <code>$0^0 = 1$</code>: <code>$f:\mathbb{N} \rightarrow \mathbb{R}$</code> <code>$f(0) := 0, f(1) := 1, f(x) := f(x - 1) + f(x - 1 - 1)$</code></p> <p>Das ist wiederum: Au&szlig;erdem ist <code>$0^0 = 1$</code>: <code>$f:\mathbb{N} \rightarrow \mathbb{R}$</code> <code>$f(0) := 0$</code>, <code>$f(1) := 1$</code>, <code>$f(x) := f(x - 1) + f(x - 2)$</code></p> <p>Diese Folge wird <a href="http://de.wikipedia.org/wiki/Fibonacci-Folge">Fibonacci-Folge</a> genannt. Es ist schon sehr erstaunlich, wie beeinflussbar wir von Symbolen und Konventionen sind.</p> <p>Und weil sie so sch&ouml;n sind, hier noch ein kurzes Video zu den Fibonacci-Zahlen: <iframe width="512" height="288" src="http://www.youtube.com/embed/kkGeOWYOFoA" frameborder="0" allowfullscreen></iframe></p> How to create your own Python module http://martin-thoma.com/how-to-create-your-own-python-module Wed, 04 Jul 2012 14:11:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-create-your-own-python-module <p>A python module is a container for some definitions and statements. You generally call it like this:</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">math</span> </code></pre></div> <p>or like that</p> <div class="highlight"><pre><code class="python"><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span> </code></pre></div> <p>or</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">math</span> <span class="kn">as</span> <span class="nn">mymath</span> </code></pre></div> <p>Python modules can also be written in C or C++, but I&#39;ll only explain how to write the module in Python. Modules can be written in C++ for performance reasons. Just take a look at <code>/usr/lib/python3.1/lib-dynload</code> with all the *.so files (shared libraries).</p> <h2>Python Paths</h2> <p>When you try to import a module, Python looks at these directories in the given order: <ul> <li>the PYTHONPATH</li> <li>the current working directory</li> <li>the default search path</li> </ul></p> <p>You get your PYTHONPATH and your default search path like this:</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">os</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;PATH&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">pathsep</span><span class="p">)</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;PYTHONPATH&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">pathsep</span><span class="p">)</span> </code></pre></div> <h2>Example</h2> <p>I&#39;ve just searched for a Python module for primes. It seems as if no such module existed. So I wrote the module <strong>primes.py</strong>.</p> <div class="highlight"><pre><code class="python"><span class="sd">&quot;&quot;&quot;</span> <span class="sd">This module offers some functions related to primes.</span> <span class="sd">&quot;&quot;&quot;</span> <span class="k">def</span> <span class="nf">miller_rabin</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">random</span> <span class="sd">&quot;&quot;&quot; Source: http://en.literateprograms.org/</span> <span class="sd"> Miller-Rabin_primality_test_(Python)</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">d</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">d</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span> <span class="n">s</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">repeat</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">a</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">a</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">miller_rabin_pass</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">def</span> <span class="nf">miller_rabin_pass</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">a_to_power</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">if</span> <span class="n">a_to_power</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">s</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">a_to_power</span> <span class="o">==</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="n">a_to_power</span> <span class="o">=</span> <span class="p">(</span><span class="n">a_to_power</span> <span class="o">*</span> <span class="n">a_to_power</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span> <span class="k">return</span> <span class="n">a_to_power</span> <span class="o">==</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">getPrimeFactors</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;Return the prime factors of n.</span> <span class="sd"> If the result is small enough to fit in an int, return an int.</span> <span class="sd"> Else return a long.</span> <span class="sd"> &gt;&gt;&gt; [getPrimeFactors(n) for n in range(11)]</span> <span class="sd"> [[], [], [2], [3], [2, 2], [5], [2, 3], [7], [2, 2, 2], [3, 3], [2, 5]]</span> <span class="sd"> &gt;&gt;&gt; getPrimeFactors(36)</span> <span class="sd"> [2, 2, 3, 3]</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="kn">import</span> <span class="nn">math</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">n</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;n must be &gt;= 0&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;n must be exact integer&quot;</span><span class="p">)</span> <span class="k">elif</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">2147483647</span><span class="p">:</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">long</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">fact</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">fact</span> <span class="k">while</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">fact</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="n">n</span> <span class="o">/=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">fact</span> <span class="k">if</span> <span class="n">miller_rabin</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">fact</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">return</span> <span class="n">fact</span> <span class="n">check</span> <span class="o">=</span> <span class="mi">3</span> <span class="n">rootn</span> <span class="o">=</span> <span class="n">n</span><span class="o">**</span><span class="mf">0.5</span> <span class="k">while</span> <span class="n">n</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">while</span> <span class="n">n</span> <span class="o">%</span> <span class="n">check</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">fact</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">check</span><span class="p">)</span> <span class="n">n</span> <span class="o">/=</span> <span class="n">check</span> <span class="n">check</span><span class="o">+=</span><span class="mi">2</span> <span class="k">return</span> <span class="n">fact</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">doctest</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span> </code></pre></div> <h2>See also</h2> <ul> <li><a href="http://docs.python.org/tutorial/modules.html">Modules</a></li> <li><a href="http://www.python-kurs.eu/modularisierung.php">Modularisierung</a> (German)</li> <li><a href="http://stackoverflow.com/q/7948494/562769">What's the difference between a Python module and a Python package?</a></li> <li>Packages: <ul> <li><a href="http://guide.python-distribute.org/creation.html">Creating a Package</a></li> <li><a href="http://docs.python.org/distutils/introduction.html">An Introduction to Distutils</a></li> </ul> </li> </ul> Wie berechnet man die Cholesky-Zerlegung? http://martin-thoma.com/wie-berechnet-man-die-cholesky-zerlegung Tue, 03 Jul 2012 17:09:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-berechnet-man-die-cholesky-zerlegung <p>Sei <code>$A \in \mathbb{R}^{n \times n}$</code> eine symmetrische, positiv definite Matrix. Dann existiert eine Zerlegung <code>$A = S \cdot D \cdot S^T$</code>, wobei <code>$S$</code> eine <a href="http://de.wikipedia.org/wiki/Dreiecksmatrix#Unipotente_Dreiecksmatrizen">unipotente Dreiecksmatrix</a> ist und D eine positiv definite Diagonalmatrix.</p> <h2>Berechnung der Cholesky-Zerlegung</h2> <p>Hier ein paar Ausschnitte, aus der englischen Wikipedia:</p> <p>Einfach von links oben nach rechts unten die Werte nach folgender Formel berechnen: <code>$D_j = A_{jj} - \sum_{k=1}^{j-1} S_{jk}^2 D_k$</code> <code>$S_{ij} = \frac{1}{D_j} \left( A_{ij} - \sum_{k=1}^{j-1} S_{ik} S_{jk} D_k \right), \qquad\text{for } i&gt;j$</code></p> <h2>Programmierer-Hinweise</h2> <h3>Implementierung</h3> <p>Eine Python-Implementierung sieht so aus:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">getSD</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; @param A: eine quadratische, reele, positiv definite Matrix</span> <span class="sd"> @return: Die Matrizen S und D, f&amp;uuml;r die gilt:</span> <span class="sd"> A = S * D * S^T</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">S</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="n">D</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">S</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">_summe</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="n">D</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">j</span><span class="p">))</span> <span class="n">D</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">_summe</span> <span class="n">_summe</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">S</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">*</span><span class="n">S</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">*</span><span class="n">D</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">j</span><span class="p">))</span> <span class="n">S</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="n">D</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">_summe</span><span class="p">)</span> <span class="k">return</span> <span class="n">S</span><span class="p">,</span> <span class="n">D</span> </code></pre></div> <h3>Bibliotheken</h3> <p>Ich habe mich mal nach Bibliotheken umgesehen, die die Cholesky-Zerlegung direkt beherrschen. NumPy kann es nat&uuml;rlich:</p> <div class="highlight"><pre><code class="python"><span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">linalg</span> <span class="k">print</span><span class="p">(</span><span class="n">linalg</span><span class="o">.</span><span class="n">cholesky</span><span class="p">([[</span><span class="mi">5</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">]]))</span> </code></pre></div> <p>Gibt aus:</p> <div class="highlight"><pre><code class="bash">array<span class="o">([[</span> 2.23606798, 0. <span class="o">]</span>, <span class="o">[</span> 0.4472136 , 0.89442719<span class="o">]])</span> </code></pre></div> <p>Das ist NICHT die Zerlegung <code>$A = S \cdot D \cdot S^T$</code>, sondern <code>$A = G \cdot G^T$</code>.</p> <p>Interessanterweise hat NumPy das nicht direkt selbst implementiert (<a href="https://github.com/numpy/numpy/blob/master/numpy/linalg/linalg.py#L448">NumPy-Quelle</a>). Man greift auf <a href="http://de.wikipedia.org/wiki/LAPACK">LAPACK</a> zur&uuml;ck, was in FORTRAN 90 programmiert wurde (<a href="http://www.netlib.org/lapack/double/dpotrf.f">LAPACK-Quelle</a>)!</p> <h3>Wolfram|Alpha</h3> <p>Auch Wolfram|Alpha kennt &quot;cholesky decomposition&quot;: <a href="http://www.wolframalpha.com/input/?i=cholesky+decomposition+%7B%7B5%2C2%7D%2C%7B2%2C1%7D%7D">Beispiel</a>. Allerdings sieht es schon bei <code>$3 \times 3$</code>-Matrizen schlecht aus.</p> <h2>Numerik</h2> <p>In Numerik haben wir bei Herrn Dr. Wei&szlig; folgendes als Cholesky-Zerlegung kennen gelernt:</p> <p>Sei <code>$A \in \mathbb{R}^{n \times n}$</code> eine symmetrische, positiv definite Matrix. Dann existiert eine Zerlegung <code>$A = \bar L \cdot \bar{L}^T$</code>, wobei <code>$\bar L$</code> eine untere Dreiecksmatrix ist.</p> <p>Wenn man wie gewohnt eine LR-Zerlegung der Matrix <code>$A$</code> durchf&uuml;hrt, erh&auml;lt man zwei Matrizen <code>$L, R \in \mathbb{R}^{n \times n}$</code>, wobei gilt: <code>$R = D \cdot L^T$</code>, wobei <code>$D$</code> eine positiv definite Diagonalmatrix ist. </p> <p>Offensichtlich gilt: <code>$\bar L = L \cdot D^{\frac{1}{2}}$</code>.</p> <p>Die Cholesky-Zerlegung kann man folgenderma&szlig;en berechnen:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/07/cholesky-zerlegung-numerik.png"><img src="../images/2012/07/cholesky-zerlegung-numerik.png" alt="" width="512" height="390" class="size-full wp-image-67881"/></a><p class="wp-caption-text"></p></div> <p>In Python sieht das dann so aus:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">getL</span><span class="p">(</span><span class="n">A</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">L</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">print</span><span class="p">(</span><span class="n">L</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">L</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">([</span><span class="n">L</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">)]))</span><span class="o">**</span><span class="mf">0.5</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="n">L</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">([</span><span class="n">L</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="o">*</span><span class="n">L</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">)]))</span> \ <span class="o">/</span> <span class="n">L</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">return</span> <span class="n">L</span> </code></pre></div> <h2>Siehe auch</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Cholesky_decomposition">Cholesky decomposition</a> (Englisch)</li> <li><a href="http://de.wikipedia.org/wiki/Cholesky-Zerlegung">Cholesky-Zerlegung</a></li> </ul> George Carlin http://martin-thoma.com/george-carlin Sun, 01 Jul 2012 17:49:23 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/george-carlin <p><a href="http://en.wikipedia.org/wiki/George_Carlin">George Carlin</a> is a great American stand-up comedian. Here are some of his clips:</p> <h2>Airplane Announcements</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/h7uMom9N5-I" frameborder="0" allowfullscreen></iframe> <iframe width="512" height="384" src="http://www.youtube.com/embed/feylIp-psJ0" frameborder="0" allowfullscreen></iframe> <h2>War</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/gnK8_KJcmWg" frameborder="0" allowfullscreen></iframe> <h2>Our Similarities</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/cgps85scy1g" frameborder="0" allowfullscreen></iframe> LaTeX + Versioning = A great Experience http://martin-thoma.com/latex-versioning-a-great-experience Fri, 29 Jun 2012 20:52:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/latex-versioning-a-great-experience <p>Some people keep asking me questions like &quot;Why do you use LaTeX?&quot; - &quot;Wouldn&#39;t it be faster to do it with Word?&quot;</p> <p>Here is the answer: <ul> <li><strong>Versioning</strong>: I do quite often create repositories for documentation (e.g. on GITHub). Versioning LaTeX-files is much better than versioning Word-files, as LaTeX is line-based. Versioning is my way to solve the following problems: <ul> <li><strong>Dead end</strong>: Once in a while I stuck while writing. I tried to improve some part of the documentation, but it didn&#39;t work. So I want to jump back. It is much more convenient to jump back in a versioning system than to press <kbd>CTRL</kbd> + <kbd>Z</kbd> often or to create copies of the old version.</li> <li><strong>Versioning</strong>: This might sound strange, but versioning was a problem for me as I wrote my &quot;Facharbeit&quot; (a thesis you have to write in Germany at the end of secondary school). I had so many backups that I didn&#39;t know what was the original. If you use a versioning system, you can have everything in one place.</li> <li><strong>Simpler collaboration</strong>: Some weeks ago I had to prepare a <a href="http://cloud.github.com/downloads/MartinThoma/ICPC-Referat/Graphentheorie-2.pdf">presentation about graph algorithms</a> with three fellow students. We just met once to decide how to split the project. After that, everybody could work on his part while everybody could see the progress. We had no need of merging the documents. (See <a href="https://github.com/MartinThoma/ICPC-Referat">GITHub-Repository</a>)</li> <li><strong>Simpler proofreading</strong>: The proofreader can make a fork of the repository with the documentation and make changes on his copy. After that, the writer can make a diff and see if he wants to take those changes. You can&#39;t forget small changes of the proofreader (like a &quot;,&quot; you forgot / you made too much) with diffs.</li> <li><strong>Backups</strong>: I&#39;ve been ultra-paranoid as I wrote my thesis for secondary school. I regularly sent a copy to my father per Email and I had at least two copies on different data storage mediums. I wouldn&#39;t have needed this if I used versioning with GITHub. (I trust in the reliability of the service GITHub offers)</li> </ul> </li> <li><strong>Accessibility</strong>: To open LaTeX, you only need a text editor. If you want to complie it, you have to get one of many free LaTeX distributions like TeX-Live. After compiling it you get a PDF. PDFs look always the same, so you don&#39;t have the problem of shifted margins.</li> <li><strong>Speed</strong>: I can write mathematical formulae much faster with LaTeX than with Word.</li> <li><strong>Professional look</strong>: You can quite often see if a presentation / documentation was written with LaTeX or with Word. I think the LaTeX-Documentations do look much more professional.</li> <li><strong>Source Code Inclusion</strong>: You can include and highlight source code directly within LaTeX. No need for copy and paste (see <a href="../how-to-print-source-code-with-latex/" title="How to print Source Code with LaTeX">How to print Source Code with LaTeX</a>, <a href="../how-print-mips-assembly-code-latex/" title="How to print MIPS assembly code in LaTeX">How to print MIPS assembly code in LaTeX</a>)</li> <li><strong>Great Visualizations</strong>: You can create great visualizations directly within LaTeX (see , <a href="../how-to-draw-a-finite-state-machine/" title="How to draw a finite-state machine">How to draw a finite-state machine</a>, <a href="../plotting-function-graphs-with-latex/" title="Plotting function graphs with LaTeX">Plotting function graphs with LaTeX</a> and <a href="../complex-latex-visualizations-tikz/" title="Complex LaTeX visualizations (Tikz)">Complex LaTeX visualizations (Tikz)</a>)</li> </ul></p> <p>I guess some might not know what a diff is or how it can look like. diff is a program that compares text files. This is an example with two text files. Each of them has 100 paragraphs:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~/Desktop<span class="sb">`</span><span class="nv">$ </span>diff file1.txt file2.txt 127,128d126 &lt; And here is another one. &lt; 189c187 &lt; Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue dui s dolore te feugait nulla facilisi. --- &gt; Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 191c189 &lt; Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nosnummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. --- &gt; Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. </code></pre></div> <p>If you use meld it looks like this: <a href="../images/2012/06/meld-diff.png"><img src="../images/2012/06/meld-diff-300x156.png" alt="" title="meld-diff" width="300" height="156" class="aligncenter size-medium wp-image-29051" /></a></p> <h2>My LaTeX configuration</h2> <p>First, you have to install the latest LaTeX-Version: <a href="../how-to-install-the-latest-latex-version/" title="How to install the latest LaTeX Version">How to install the latest LaTeX Version</a>.</p> <p>I like editing the source code directly very much. To do so, I use gEdit. When I press Ctrl+M, my LaTeX document gets saved, compiled and the temporary files are thrown away. If you want this, you should follow these instructions.</p> <ul> <li>Create a "Makefile" (a file called this way) with this content in the folder where your LaTeX file is:</li> </ul> <div class="highlight"><pre><code class="text">make: pdflatex matrix.tex -output-format=pdf make clean clean: rm -rf $`(TARGET) *.class *.html *.log *.aux </code></pre></div> <ul> <li>Enable the Plugin "External Tools"</li> <li>Go to Preferences &rarr; Plugins &rarr; External Tools &rarr; Configure Plugin</li> <li>Click on the New Page icon</li> <li>Insert "make" into the Edit-Window</li> <li>Create the Shortcut Key. I've added Ctrl+M.</li> </ul> <h2>See also</h2> <ul> <li><a href="http://academia.stackexchange.com/a/5281/4092">Why use version control systems for writing a paper</a> instead of Dropbox</li> </ul> Complex LaTeX visualizations (Tikz) http://martin-thoma.com/complex-latex-visualizations-tikz Fri, 29 Jun 2012 16:38:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/complex-latex-visualizations-tikz <p>You can create some very complex visualizations with LaTeX. Take a look at these:</p> <div style="width: 322px" class="wp-caption aligncenter"><a href="../images/2012/06/circumscribed-polygons-and-circles.png"><img src="../images/2012/06/circumscribed-polygons-and-circles.png" alt="" width="322" height="322" class="size-full wp-image-28871"/></a><p class="wp-caption-text"></p></div> <p>Used matlab Source: <a href="http://www.texample.net/tikz/examples/circumscribed-polygons-and-circles/">texample.net</a></p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/06/mosaik-from-pompeii.png"><img src="../images/2012/06/mosaik-from-pompeii.png" alt="" width="400" height="400" class="size-full wp-image-28881"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/mosaic-from-pompeii/">texample.net</a></p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/06/dandelin-spheres.png"><img src="../images/2012/06/dandelin-spheres.png" alt="" width="400" height="400" class="size-full wp-image-28891"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/dandelin-spheres/">texample.net</a></p> <div style="width: 472px" class="wp-caption aligncenter"><a href="../images/2012/06/dipolar-magnetic-field.png"><img src="../images/2012/06/dipolar-magnetic-field.png" alt="" width="472" height="343" class="size-full wp-image-28901"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/dipolar-magnetic-field/">texample.net</a></p> <div style="width: 408px" class="wp-caption aligncenter"><a href="../images/2012/06/gamma-interaction.png"><img src="../images/2012/06/gamma-interaction.png" alt="" width="408" height="322" class="size-full wp-image-28921"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/gamma-interaction/">texample.net</a></p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/06/complete-graph.png"><img src="../images/2012/06/complete-graph.png" alt="" width="400" height="400" class="size-full wp-image-28931"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/complete-graph/">texample.net</a></p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/06/mandala.png"><img src="../images/2012/06/mandala.png" alt="" width="400" height="400" class="size-full wp-image-28951"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/mandala/">texample.net</a></p> <div style="width: 497px" class="wp-caption aligncenter"><a href="../images/2012/06/pascals-triangle.png"><img src="../images/2012/06/pascals-triangle.png" alt="" width="497" height="342" class="size-full wp-image-28961"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/pascals-triangle-and-sierpinski-triangle/">texample.net</a></p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/06/seismic-focal-mechanism.png"><img src="../images/2012/06/seismic-focal-mechanism.png" alt="" width="512" height="470" class="size-full wp-image-28971"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/seismic-focal-mechanism-in-3d-view/">texample.net</a></p> <div style="width: 492px" class="wp-caption aligncenter"><a href="../images/2012/06/membrane-surface.png"><img src="../images/2012/06/membrane-surface.png" alt="" width="492" height="358" class="size-full wp-image-28981"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/membrane-surface/">texample.net</a></p> <div style="width: 494px" class="wp-caption aligncenter"><a href="../images/2012/06/mindmap.png"><img src="../images/2012/06/mindmap.png" alt="" width="494" height="404" class="size-full wp-image-28991"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/computer-science-mindmap/">texample.net</a></p> <div style="width: 477px" class="wp-caption aligncenter"><a href="../images/2012/06/spherical-and-cartesian-grids.png"><img src="../images/2012/06/spherical-and-cartesian-grids.png" alt="" width="477" height="457" class="size-full wp-image-29001"/></a><p class="wp-caption-text"></p></div> <p>Source: <a href="http://www.texample.net/tikz/examples/spherical-and-cartesian-grids/">texample.net</a></p> <p>Do you know more? Please leave a comment!</p> <h2>See also</h2> <ul> <li><a href="http://tex.stackexchange.com/q/61437/5645">Penrose tiling in TikZ</a></li> <li><a href="http://www.texample.net/tikz/examples/lindenmayer-systems/">Lindenmayer systems</a></li> <li><a href="http://tex.stackexchange.com/q/54341/5645">How to draw nanotubes with TeX</a></li> </ul> Perfect number check and ROT-13 encryption in MIPS-assembly code http://martin-thoma.com/perfect-number-check-rot-13-encryption-mips-assembly-code Fri, 22 Jun 2012 08:43:49 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/perfect-number-check-rot-13-encryption-mips-assembly-code <h2>Perfect number check</h2> <p>The perfect number check in MIPS is quite easy to realize. Here is some pythonic Pseudocode</p> <div class="highlight"><pre><code class="python"><span class="n">n</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="c"># read a positive integer n from the user</span> <span class="n">sumOfDivisors</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span> <span class="c"># go from 1 to n-1</span> <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># if i is a divisor</span> <span class="n">sumOfDivisors</span> <span class="o">+=</span> <span class="n">i</span> <span class="k">if</span> <span class="n">sumOfDivisors</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;1&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;0&quot;</span> </code></pre></div> <p>And here is the MIPS-Code:</p> <div class="highlight"><pre><code class="text">##################################################################### # Perfect number check # # @param int the number you would like to check # # @result int 0 if the number is not perfect, otherwise 1 # ##################################################################### .data prompt: .asciiz &quot;Positive integer you would like to check : &quot; output: .asciiz &quot;Is a perfect number (1: Yes, 0: No): &quot; .text .globl main main: li `$v0 , 4 # | la $`a0 , prompt # | syscall # |=&gt; Print string &quot;prompt&quot; li `$v0 , 5 # | syscall # |=&gt; Ask for integer A # Initialise variables move $`s0 , `$v0 # =&gt; Store A in $`s0 li `$s1 , 0 # =&gt; The sum of all proper divisors of A li $`s2 , 1 # =&gt; start here with checks for devisors s: bgeu `$s2, $`s0, eval # while `$s2 &lt; $`s0 rem `$t0, $`s0, `$s2 # $`t0 = `$s0 % $`s2 bne `$t0, $`0, w addu `$s1, $`s1, `$s2 # $`s1 += `$s2 w: addi $`s2, `$s2, 1 # $`s2++ j s; # /endwhile eval: seq `$s0, $`s0, `$s1 # Compare the sum of divisors with A li $`v0 , 4 # | la `$a0 , output # | syscall # |=&gt; Print string &quot;output&quot; la $`v0 , 1 # | move `$a0 , $`s0 # | syscall # |=&gt; Print `$s0 jr $`ra </code></pre></div> <h2>ROT-13 encryption</h2> <p>The basic idea for encrypting a string with ROT-13 is to loop over all characters and use the ASCII-Table to shift them. Here is the ROT-13 MIPS-Code:</p> <div class="highlight"><pre><code class="text">##################################################################### # @param string a &amp;#92;&amp;#48; terminated string # # @return string the ROT-13 encrypted string # ##################################################################### .data prompt: .asciiz &quot;Please enter string: &quot; output: .asciiz &quot;ROT-13: &quot; plain: .space 64 .text .globl main main: li `$v0, 4 # | la $`a0, prompt # | syscall # |=&gt; Print string &quot;prompt&quot; li `$v0, 8 # | la $`a0, plain # | =&gt; Ask for string plain li `$a1, 64 # | syscall # | =&gt; read a string with max. 64 chars li $`t2, 10 # Stop by \n # Loop over all characters la `$t1, ($`a0) #=&gt;`$t1:the current adress that gets modified s: lb $`t0, (`$t1) # =&gt; $`t0: the current value (char) beq `$t0, $`t2, out # while `$t1 != &#39;\n&#39; li $`t3, 64 bge `$t3, $`t0, w # if `$t0 &lt;= 64: jump to w li $`t3, 123 bge `$t0, $`t3, w # if `$t0 &gt;= 123: jump to w li $`t3, 90 bge `$t3, $`t0, big # if `$t0 &lt;= 90: jump to big li $`t3, 96 bge `$t3, $`t0, w # if `$t0 &lt;= 96: jump to w j small w: addi $`t1, `$t1, 1 # $`t1++ j s; # /endwhile small: addi `$t0, -84 # -97 + 13 rem $`t0, `$t0, 26 # $`t0 %= 26 addi `$t0, 97 sb $`t0, (`$t1) j w big: addi $`t0, -52 # -65 + 13 rem `$t0, $`t0, 26 # `$t0 %= 26 addi $`t0, 65 sb `$t0, ($`t1) j w out: li `$v0, 4 # | la $`a0, output # | syscall # |=&gt; Print string &quot;output&quot; la `$v0, 4 # | la $`a0, plain # | syscall # |=&gt; Print plain jr $ra </code></pre></div> <p>A syntax-highlighted version of both code pieces is here: <a href='../images/2012/06/mips-rot-13-perfect-number.pdf'>MIPS Assembly Code for a perfect number check and ROT-13 encryption</a>.</p> <h2>See also</h2> <ul> <li><a href="https://sourceforge.net/projects/spimsimulator/files/">SPIM MIPS Simulator</a></li> <li><a href="../how-print-mips-assembly-code-latex/" title="How to print MIPS assembly code in LaTeX">How to print MIPS assembly code in LaTeX</a></li> <li><a href="../add-mips-syntax-highlighting-gedit/" title="Add MIPS syntax highlighting to gEdit">Add MIPS syntax highlighting to gEdit</a></li> <li><a href='../images/2012/06/mips-archive.zip'>Archive with MIPS assembly Code and LaTeX file</a></li> </ul> Part I: Performance of Matrix multiplication in Python, Java and C++ http://martin-thoma.com/matrix-multiplication-python-java-cpp Mon, 18 Jun 2012 19:37:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/matrix-multiplication-python-java-cpp <div class="info">This is Part I of my matrix multiplication series. <a href="../matrix-multiplication-python-java-cpp/">Part I</a> was about simple matrix multiplication algorithms and <a href="../strassen-algorithm-in-python-java-cpp/">Part II</a> was about the Strassen algorithm. <a href="../part-iii-matrix-multiplication-on-multiple-cores-in-python-java-and-c/">Part III</a> is about parallel matrix multiplication.</div> <p>This post is about simple implementations of matrix multiplications. The goal of this post is to find out how easy it is to implement a matrix multiplication in Python, Java and C++. Additionally, I want to get to know how good these solutions are.</p> <p>The second post will be an implementation of the Strassen algorithm for matrix multiplication. <a href="http://en.wikipedia.org/wiki/Strassen_algorithm">Strassen algorithm</a> does matrix multiplication in <code>$\cal O(n^{log_2(7)+o(1)}) \approx \cal O(n^{2.807})$</code> instead of <code>$\cal O(n^3)$</code>. I am quite sure this will outperform almost every other change. See Part II: <a href="../strassen-algorithm-in-python-java-cpp/">The Strassen algorithm in Python, Java and C++</a>.</p> <p>The third post will be about parallel programming. I have two cores and I want to see if it will be significantly faster if I use both of them.</p> <h2>The implementations</h2> <p>I will post all scripts for this test and I&#39;ve added a <a href="https://github.com/MartinThoma/matrix-multiplication">GIT repository</a>, so feel free to test it on your machine. I am also happy if you post some of your solutions with running times :-) I am quite sure that my Java and C++ code can be written much better. If you know how, please leave a comment. If you know other languages, you could create a script for these. I focus on Python, Java and C++ as they are very often used.</p> <p>I have implemented these three types of algorithms for this post: <ul> <li><strong>ijk-algorithm</strong>: This is a simple, straight forward implementation of a matrix multiplication. I&#39;ve used the definition of matrix multiplication. I didn&#39;t use multiple threads.</li> <li><strong>ikj-algorithm</strong>: just like the ijk-algorithm, but I&#39;ve switched two of the three the for-loops.</li> <li><strong>Library-functions</strong>: I always prefer libraries over self-implemented solutions. I think they are faster than anything I could come up with in a reasonable amount of time.</li> </ul></p> <p>If you post a solution, please consider these restrictions: <ul> <li><strong>Input</strong>: The input file should get passed with the parameter <code>-i</code>, e.g.: <code>python -i 2000.in</code> or <code>java Shell -i 2000.in</code></li> <li>The standard value for the command line parameter -i should be &quot;2000.in&quot; (a <code>$2000 \times 2000$</code> matrix)</li> <li>The user should <em>not</em> have to give the size of the matrix!</li> <li>The two square-matrices that should get multiplied are ... <ul> <li>... read from a text-file.</li> <li>... represented like this: <ul> <li>Every line of one matrix is one line in the text-file.</li> <li>Newlines are only &quot;\n&quot;.</li> <li>Every number is separated by &quot;\t&quot;.</li> <li>The both matrices are separated by one newline.</li> </ul> </li> </ul> </li> <li><strong>Output</strong>: The result has to get printed to standard output.</li> <li>The result has to be formatted like the input (tabs for separation of number, \n for marks a new line)</li> </ul></p> <h2>The Tests</h2> <p>I will check the speed of a multiplication of two big matrices following for Python, Java and C++ for all algorithms like this:</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>python scriptABC.py -i ../2000.in &gt; result.txt diff result.txt bigMatrix.out </code></pre></div> <p>The <code>bigMatrix.out</code> was produced by the Python ijk-implementation. I make the diff to test if the result is correct.</p> <h2>The Setting</h2> <p>I created two &quot;random&quot; matrices <code>$A, B \in \mathbb{N}^{2000 \times 2000}$</code> with this script. The file that was created needs about 29.7 MB and is also in the GIT-Hub repository. But you can also create the matrices with this script:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">random</span> <span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">1234</span><span class="p">)</span> <span class="k">def</span> <span class="nf">createRandomMatrix</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">maxVal</span> <span class="o">=</span> <span class="mi">1000</span> <span class="c"># I don&#39;t want to get Java / C++ into trouble</span> <span class="n">matrix</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">maxVal</span><span class="p">)</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span> <span class="k">return</span> <span class="n">matrix</span> <span class="k">def</span> <span class="nf">saveMatrix</span><span class="p">(</span><span class="n">matrixA</span><span class="p">,</span> <span class="n">matrixB</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">matrix</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">([</span><span class="n">matrixA</span><span class="p">,</span> <span class="n">matrixB</span><span class="p">]):</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">3</span> <span class="n">matrixA</span> <span class="o">=</span> <span class="n">createRandomMatrix</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">matrixB</span> <span class="o">=</span> <span class="n">createRandomMatrix</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">saveMatrix</span><span class="p">(</span><span class="n">matrixA</span><span class="p">,</span> <span class="n">matrixB</span><span class="p">,</span> <span class="s">&quot;2000.in&quot;</span><span class="p">)</span> </code></pre></div> <p>All scripts are tested on my computer: <table> <tr> <td colspan="2" style="background-color:#cdcdcd">Acer TravelMate 5735Z</td> </tr> <tr> <td style="background-color:#efefef">CPU</td> <td>2x Pentium(R) Dual-Core CPU T4500 @2.30GHz</td> </tr> <tr> <td style="background-color:#efefef">RAM</td> <td>4 GB</td> </tr> <tr> <td style="background-color:#efefef">Video Card</td> <td>Intel GMA 4500MHD</td> </tr> <tr> <td style="background-color:#efefef">System</td> <td>Ubuntu 10.10.04 LTS</td> </tr> </table></p> <h2>Python</h2> <p>I&#39;ve used Python 2.6.5.</p> <h3>ijk-algorithm</h3> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;2000.in&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="k">def</span> <span class="nf">standardMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">standardMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 56m49.266s user 56m30.524s sys 0m2.980s </code></pre></div> <h3>ikj-algorithm</h3> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">ikjMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 44m36.507s user 44m13.458s sys 0m2.000s </code></pre></div> <h3>Psyco ikj-algorithm</h3> <p><a href="http://en.wikipedia.org/wiki/Psyco">Psyco</a> is a just in time compiler, which makes my scripts MUCH faster. It is very simple to use. Add these two lines at the top of the ikj-script:</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">psyco</span> <span class="n">psyco</span><span class="o">.</span><span class="n">full</span><span class="p">()</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 6m14.820s user 6m12.959s sys 0m0.620s </code></pre></div> <p>Amazing, isn&#39;t it?</p> <h3>Libraries</h3> <h4>NumPy</h4> <p>NumPy-Version: 1.3.0 (Current version is 1.6.2, see <a href="http://en.wikipedia.org/wiki/NumPy">Wiki</a>)</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;2000.in&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">A</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">B</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">A</span> <span class="o">*</span> <span class="n">B</span> <span class="c"># easy and intuitive, isn&#39;t it?</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 1m38.425s user 1m36.066s sys 0m0.520s </code></pre></div> <h4>SciPy</h4> <p>You might need to install <code>python-scitools</code>.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="nn">scipy</span> <span class="kn">from</span> <span class="nn">optparse</span> <span class="kn">import</span> <span class="n">OptionParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">OptionParser</span><span class="p">()</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;filename&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;2000.in&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;input file with two matrices&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">A</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> <span class="k">if</span> <span class="n">line</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">matrix</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">B</span> <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="k">def</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span> <span class="n">matrix</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">line</span><span class="p">))</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span> <span class="n">A</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">B</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">matrix</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="n">A</span> <span class="o">*</span> <span class="n">B</span> <span class="c"># easy and intuitive, isn&#39;t it?</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 1m35.795s user 1m33.438s sys 0m0.488s </code></pre></div> <h3>Conclusion for Python</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/06/python-execution-times.png"><img src="../images/2012/06/python-execution-times.png" alt="" width="512" height="315" class="size-full wp-image-28301"/></a><p class="wp-caption-text"></p></div> <p>Using NumPy is by far the easiest and fastest option. I&#39;ve needed about five minutes for each of the non-library scripts and about 10 minutes for the NumPy/SciPy scripts.</p> <p>By the way, it is useless to combine Psyco and NumPy. It gets a little bit faster (1 minute and 28 seconds), but this could also be a random effect. If you execute it many times, you will see that the execution time is never the same.</p> <h2>Java</h2> <p>I am using this Java version:</p> <div class="highlight"><pre><code class="bash"><span class="sb">`</span><span class="nv">$ </span>java -version java version <span class="s2">&quot;1.6.0_20&quot;</span> OpenJDK Runtime Environment <span class="o">(</span>IcedTea6 1.9.13<span class="o">)</span> <span class="o">(</span>6b20-1.9.13-0ubuntu1~10.04.1<span class="o">)</span> OpenJDK Server VM <span class="o">(</span>build 19.0-b09, mixed mode<span class="o">)</span> </code></pre></div> <h3>ijk-algorithm</h3> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.io.BufferedReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.FileReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Shell</span> <span class="o">{</span> <span class="kd">static</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="nf">read</span><span class="o">(</span><span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;();</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;();</span> <span class="n">String</span> <span class="n">thisLine</span><span class="o">;</span> <span class="k">try</span> <span class="o">{</span> <span class="n">BufferedReader</span> <span class="n">br</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BufferedReader</span><span class="o">(</span> <span class="k">new</span> <span class="nf">FileReader</span><span class="o">(</span><span class="n">filename</span><span class="o">));</span> <span class="c1">// Begin reading A</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">thisLine</span><span class="o">.</span><span class="na">trim</span><span class="o">().</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;&quot;</span><span class="o">))</span> <span class="o">{</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">A</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="c1">// Begin reading B</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">B</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="n">br</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Error: &quot;</span> <span class="o">+</span> <span class="n">e</span><span class="o">);</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="n">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;();</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">A</span><span class="o">);</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">B</span><span class="o">);</span> <span class="k">return</span> <span class="n">res</span><span class="o">;</span> <span class="o">}</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">ijkAlgorithm</span><span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="c1">// initialise C</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">k</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+=</span> <span class="n">A</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">)</span> <span class="o">*</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">printMatrix</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">matrix</span><span class="o">)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">line</span> <span class="o">:</span> <span class="n">matrix</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">StringBuilder</span> <span class="n">sb</span> <span class="o">=</span> <span class="k">new</span> <span class="n">StringBuilder</span><span class="o">(</span><span class="n">matrix</span><span class="o">.</span><span class="na">length</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">number</span> <span class="o">:</span> <span class="n">line</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">i</span><span class="o">++;</span> <span class="o">}</span> <span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">number</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">sb</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">String</span> <span class="n">filename</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;2000.in&quot;</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">args</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;&gt;</span> <span class="n">matrices</span> <span class="o">=</span> <span class="n">read</span><span class="o">(</span><span class="n">filename</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="n">ijkAlgorithm</span><span class="o">(</span><span class="n">A</span><span class="o">,</span> <span class="n">B</span><span class="o">);</span> <span class="n">printMatrix</span><span class="o">(</span><span class="n">C</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 27m21.295s user 26m53.877s sys 0m4.368s </code></pre></div> <p>Note: Java is not C++! If you use <a href="http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html">Vector</a> instead of <a href="http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html">ArrayList</a>, you get these results:</p> <div class="highlight"><pre><code class="bash">real 82m26.754s user 80m42.003s sys 0m24.598s </code></pre></div> <p>One reason might be that Vector is synchronized.</p> <h3>ikj-algoirthm</h3> <p>I&#39;ve only switched line 60 and line 61.</p> <div class="highlight"><pre><code class="bash">real 2m9.478s user 1m26.369s sys 0m39.162s </code></pre></div> <h3>Library: JAMA</h3> <p>I&#39;ve searched in Google for &quot;java matrix multiplication&quot;. The first 10 results were only implementations of the ijk-algorithm. Although the ijk-algorithm is very easy, most of the results were only questions where people tried to implement it.</p> <p>After some search (20 minutes minimum) I&#39;ve found <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a>. They also have a <a href="http://math.nist.gov/javanumerics/jama/doc/">documentation</a>. You might need to install this for the following code:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install libjama-* </code></pre></div> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.io.BufferedReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.FileReader</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">Jama.Matrix</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Shell</span> <span class="o">{</span> <span class="kd">static</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;&gt;</span> <span class="nf">read</span><span class="o">(</span><span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;();</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;();</span> <span class="n">String</span> <span class="n">thisLine</span><span class="o">;</span> <span class="k">try</span> <span class="o">{</span> <span class="n">BufferedReader</span> <span class="n">br</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BufferedReader</span><span class="o">(</span><span class="k">new</span> <span class="n">FileReader</span><span class="o">(</span><span class="n">filename</span><span class="o">));</span> <span class="c1">// Begin reading A</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">thisLine</span><span class="o">.</span><span class="na">trim</span><span class="o">().</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;&quot;</span><span class="o">))</span> <span class="o">{</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="kt">double</span><span class="o">)</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">A</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="c1">// Begin reading B</span> <span class="k">while</span> <span class="o">((</span><span class="n">thisLine</span> <span class="o">=</span> <span class="n">br</span><span class="o">.</span><span class="na">readLine</span><span class="o">())</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;</span> <span class="n">line</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;();</span> <span class="n">String</span><span class="o">[]</span> <span class="n">lineArray</span> <span class="o">=</span> <span class="n">thisLine</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">number</span> <span class="o">:</span> <span class="n">lineArray</span><span class="o">)</span> <span class="o">{</span> <span class="n">line</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="kt">double</span><span class="o">)</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">number</span><span class="o">));</span> <span class="o">}</span> <span class="n">B</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">line</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">err</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Error: &quot;</span> <span class="o">+</span> <span class="n">e</span><span class="o">);</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;&gt;</span> <span class="n">res</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;&gt;();</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">A</span><span class="o">);</span> <span class="n">res</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">B</span><span class="o">);</span> <span class="k">return</span> <span class="n">res</span><span class="o">;</span> <span class="o">}</span> <span class="kd">static</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">ijkAlgorithm</span><span class="o">(</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">A</span><span class="o">,</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;&gt;</span> <span class="n">B</span><span class="o">)</span> <span class="o">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="c1">// initialise C</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">C</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">k</span><span class="o">++)</span> <span class="o">{</span> <span class="n">C</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+=</span> <span class="n">A</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">)</span> <span class="o">*</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> <span class="k">return</span> <span class="n">C</span><span class="o">;</span> <span class="o">}</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">printMatrix</span><span class="o">(</span><span class="n">Matrix</span> <span class="n">matrix</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">j</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">&quot;\t&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">&quot;%.0f&quot;</span><span class="o">,</span> <span class="n">matrix</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">j</span><span class="o">));</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;&quot;</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">String</span> <span class="n">filename</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;2000.in&quot;</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">args</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span> <span class="o">}</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;&gt;</span> <span class="n">matrices</span> <span class="o">=</span> <span class="n">read</span><span class="o">(</span><span class="n">filename</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Double</span><span class="o">&gt;&gt;</span> <span class="n">B</span> <span class="o">=</span> <span class="n">matrices</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="kt">double</span><span class="o">[][]</span> <span class="n">Aarray</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="kt">double</span><span class="o">[][]</span> <span class="n">Barray</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="n">n</span><span class="o">][</span><span class="n">n</span><span class="o">];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span> <span class="n">Aarray</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="n">Barray</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">B</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">get</span><span class="o">(</span><span class="n">j</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="n">Matrix</span> <span class="n">AM</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Matrix</span><span class="o">(</span><span class="n">Aarray</span><span class="o">);</span> <span class="n">Matrix</span> <span class="n">BM</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Matrix</span><span class="o">(</span><span class="n">Aarray</span><span class="o">);</span> <span class="n">Matrix</span> <span class="n">CM</span> <span class="o">=</span> <span class="n">AM</span><span class="o">.</span><span class="na">times</span><span class="o">(</span><span class="n">BM</span><span class="o">);</span> <span class="n">printMatrix</span><span class="o">(</span><span class="n">CM</span><span class="o">,</span> <span class="n">n</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 1m36.506s user 0m51.367s sys 0m45.043s </code></pre></div> <p>It took me about two hours to get it work. I had to add the JAMA-JAR to eclipse, export my project as a JAR and run it with</p> <div class="highlight"><pre><code class="bash"><span class="nb">time </span>java -jar jama-shell.jar -i ../2000.in &gt; jama-result.out </code></pre></div> <p>I still have no idea how to compile it with bash only.</p> <h3>Conclusion for Java</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/06/java-execution-time.png"><img src="../images/2012/06/java-execution-time.png" alt="" width="512" height="287" class="size-full wp-image-28331"/></a><p class="wp-caption-text"></p></div> <p>You should definitely know if some Java-datastructures are synchronised or not. And you should know how the computer / caches work.</p> <h2>C++</h2> <p>I have gcc 4.4.3 and compiled everything with these options:</p> <div class="highlight"><pre><code class="bash">g++ -std<span class="o">=</span>c++98 -Wall -O3 -g myScript.cpp -o <span class="nv">$`</span><span class="o">(</span>PROBLEM<span class="o">)</span>.out -pedantic </code></pre></div> <h3>ijk-algorithm</h3> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;sstream&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;fstream&gt;</span> <span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Result</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">B</span><span class="p">;</span> <span class="p">};</span> <span class="n">Result</span> <span class="nf">read</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">;</span> <span class="n">Result</span> <span class="n">ab</span><span class="p">;</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">ifstream</span> <span class="n">infile</span><span class="p">;</span> <span class="n">infile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">line</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">A</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">B</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">B</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="kt">int</span> <span class="n">a</span><span class="p">;</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">infile</span><span class="p">.</span><span class="n">close</span><span class="p">();</span> <span class="n">ab</span><span class="p">.</span><span class="n">A</span> <span class="o">=</span> <span class="n">A</span><span class="p">;</span> <span class="n">ab</span><span class="p">.</span><span class="n">B</span> <span class="o">=</span> <span class="n">B</span><span class="p">;</span> <span class="k">return</span> <span class="n">ab</span><span class="p">;</span> <span class="p">}</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">ijkalgorithm</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">A</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">B</span><span class="p">)</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">A</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="c1">// initialise C with 0s</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">tmp</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">C</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">tmp</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="n">C</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">matrix</span><span class="p">)</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">inner</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="n">it</span><span class="o">=</span><span class="n">matrix</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">matrix</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">it</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">inner</span> <span class="o">=</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">begin</span><span class="p">();</span> <span class="n">inner</span> <span class="o">!=</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">end</span><span class="p">();</span> <span class="n">inner</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">inner</span><span class="p">;</span> <span class="k">if</span><span class="p">(</span><span class="n">inner</span><span class="o">+</span><span class="mi">1</span> <span class="o">!=</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kt">int</span> <span class="n">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">string</span> <span class="n">filename</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;2000.in&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> <span class="p">}</span> <span class="n">Result</span> <span class="n">result</span> <span class="o">=</span> <span class="n">read</span> <span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">C</span> <span class="o">=</span> <span class="n">ijkalgorithm</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">A</span><span class="p">,</span> <span class="n">result</span><span class="p">.</span><span class="n">B</span><span class="p">);</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 1m40.439s user 1m38.642s sys 0m0.280s </code></pre></div> <h3>ikj-algorithm</h3> <p>Again, I&#39;ve only switched line 61 and 62.</p> <div class="highlight"><pre><code class="bash">real 0m15.172s user 0m14.877s sys 0m0.248s </code></pre></div> <h3>Library: Boost</h3> <p>If you want to compile these scripts, you might have to install the boost libraries first. On Ubuntu you can enter:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install libboost-math* </code></pre></div> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;sstream&gt;</span> <span class="cp">#include &lt;string&gt;</span> <span class="cp">#include &lt;fstream&gt;</span> <span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;boost/numeric/ublas/matrix.hpp&gt;</span> <span class="cp">#include &lt;boost/numeric/ublas/io.hpp&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="k">struct</span> <span class="n">Result</span> <span class="p">{</span> <span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">matrix</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">A</span><span class="p">;</span> <span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">matrix</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">B</span><span class="p">;</span> <span class="p">};</span> <span class="kt">int</span> <span class="nf">getMatrixSize</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">ifstream</span> <span class="n">infile</span><span class="p">;</span> <span class="n">infile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span> <span class="k">return</span> <span class="n">count</span><span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">line</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="sc">&#39;\t&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">printMatrix</span><span class="p">(</span><span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">matrix</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">matrix</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">matrix</span><span class="p">.</span><span class="n">size1</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">matrix</span><span class="p">.</span><span class="n">size2</span><span class="p">();</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">matrix</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">);</span> <span class="k">if</span><span class="p">(</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span> <span class="o">!=</span> <span class="n">matrix</span><span class="p">.</span><span class="n">size2</span><span class="p">())</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">Result</span> <span class="nf">read</span><span class="p">(</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span> <span class="p">{</span> <span class="n">Result</span> <span class="n">ab</span><span class="p">;</span> <span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">ifstream</span> <span class="n">infile</span><span class="p">;</span> <span class="n">infile</span><span class="p">.</span><span class="n">open</span> <span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="c1">// get dimension</span> <span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span> <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">getMatrixSize</span><span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">matrix</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">A</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">),</span> <span class="n">B</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">);</span> <span class="c1">// process first line</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="o">!</span><span class="n">line</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">A</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">getline</span><span class="p">(</span><span class="n">infile</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span> <span class="p">{</span> <span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="n">line</span><span class="p">);</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span> <span class="p">(</span><span class="n">iss</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="n">B</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="n">infile</span><span class="p">.</span><span class="n">close</span><span class="p">();</span> <span class="n">ab</span><span class="p">.</span><span class="n">A</span> <span class="o">=</span> <span class="n">A</span><span class="p">;</span> <span class="n">ab</span><span class="p">.</span><span class="n">B</span> <span class="o">=</span> <span class="n">B</span><span class="p">;</span> <span class="k">return</span> <span class="n">ab</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">string</span> <span class="n">filename</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;2000.in&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> <span class="p">}</span> <span class="n">Result</span> <span class="n">result</span> <span class="o">=</span> <span class="n">read</span> <span class="p">(</span><span class="n">filename</span><span class="p">);</span> <span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">matrix</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">C</span><span class="p">;</span> <span class="n">C</span> <span class="o">=</span> <span class="n">boost</span><span class="o">::</span><span class="n">numeric</span><span class="o">::</span><span class="n">ublas</span><span class="o">::</span><span class="n">prod</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">A</span><span class="p">,</span> <span class="n">result</span><span class="p">.</span><span class="n">B</span><span class="p">);</span> <span class="n">printMatrix</span><span class="p">(</span><span class="n">C</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">real 4m15.388s user 4m10.272s sys 0m0.588s </code></pre></div> <h3>Library: Blitz</h3> <p>This is a great example of useless library. I&#39;ve installed the library:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install libblitz* </code></pre></div> <p>Then I wanted to use it. Well, I have no clue how I could exactly use it! See my StackOverflow Question: <a href="http://stackoverflow.com/questions/11113993/is-a-documentation-of-blitz-matrices-available">Is a documentation of Blitz++ matrices available?</a></p> <h3>Conclusion for C++</h3> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/06/cpp-execution-time.png"><img src="../images/2012/06/cpp-execution-time.png" alt="" width="512" height="249" class="size-full wp-image-28351"/></a><p class="wp-caption-text"></p></div> <p>Again, it brings a performance boost if you know how your CPU works. I was very astonished, that the library Boost is slower (actually MUCH slower) than my simplest approach was.</p> <h2>Conclusion</h2> <p>If I want to create a working piece of code in a minimum amount of time, I will always take Python. It has been very easy to solve this task with the given restrictions. But C++ is amazing when speed is important.</p> <p>It was astonishingly difficult to find working code examples for this task for Java and C++. I was searching for libraries and found some, but the search results were not satisfying.</p> <h2>See also</h2> <ul> <li><a href="http://www.boost.org/doc/libs/1_49_0/libs/numeric/ublas/doc/matrix.htm">Boost Matrix multiplication</a></li> <li><a href="http://rosettacode.org/wiki/Matrix_multiplication">Rosetta Code: Matrix multiplication</a> (Implementations in 63 programming languages!)</li> <li><a href="http://stackoverflow.com/questions/10442365/why-is-matrix-multiplication-faster-with-numpy-than-with-ctypes-in-python">Why is matrix multiplication faster with numpy than with ctypes in Python?</a></li> <li><a href="http://stackoverflow.com/questions/11110604/why-is-boosts-matrix-multiplication-slower-than-mine">Why is boosts matrix multiplication slower than mine?</a></li> </ul> <div class="info">Continue reading with Part II: <a href="../strassen-algorithm-in-python-java-cpp/">The Strassen algorithm in Python, Java and C++</a></div> Python Puzzle #1: List multiplication http://martin-thoma.com/python-puzzle-1-list-multiplication Mon, 18 Jun 2012 13:06:48 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-puzzle-1-list-multiplication <h2>Basic concepts</h2> <p>Image you had to multiply two small matrices in Python. You could just use the definition of a matrix product:</p> <p><code>$A, B \in \mathbb{R}^{n \times n}$</code>: <code>$C = A \cdot B, C \in \mathbb{R}^{n \times n}$</code> where the components of C are definied by <code>$c_{i,j} = \sum_{k=1}^n a_{i,k} \cdot b_{k, j}$</code></p> <p>Note that this means: <code>$\begin{pmatrix} 1 &amp; 2 \\ 3 &amp; 4 \end{pmatrix} \cdot \begin{pmatrix} 5 &amp; 6 \\ 7 &amp; 8 \end{pmatrix} = \begin{pmatrix} 19 &amp; 22 \\ 43 &amp; 50 \end{pmatrix}$</code></p> <p>You might also have heard of Pythons overloaded multiplication:</p> <div class="highlight"><pre><code class="python"><span class="k">print</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> <span class="k">print</span><span class="p">([[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="mi">4</span><span class="p">]</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="text">[0, 0, 0, 0] [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] abcabcabcabc </code></pre></div> <h2>Question</h2> <p>What do you think does the following piece of Python-Code print?</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">standardMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">n</span><span class="p">]</span><span class="o">*</span><span class="n">n</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> <span class="n">A</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]]</span> <span class="n">B</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">]]</span> <span class="k">print</span> <span class="n">standardMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span> </code></pre></div> <p>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .</p> <h2>Answer</h2> <div class="highlight"><pre><code class="text">[[32, 32], [32, 32]] </code></pre></div> <p>Python creates only one list and makes pointers to it!</p> <p>So this is one that works:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">standardMatrixProduct</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">C</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">print</span> <span class="n">C</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">return</span> <span class="n">C</span> </code></pre></div> Duolingo - Learn a Language Online http://martin-thoma.com/duolingo-learn-language-online Sun, 17 Jun 2012 10:02:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/duolingo-learn-language-online <p><a href="http://duolingo.com/">Duolingo</a> is a great online protal for learning new languages online. They currently support German, Spanish, French, Portuguese, Italian and Chinese.</p> <p>Here is a short explanation of Duolingo: <iframe width="512" height="288" src="http://www.youtube.com/embed/WyzJ2Qq9Abs" frameborder="0" allowfullscreen></iframe></p> <p>The inventor of duolingo, Luis von Ahn, did also a great TED-Talk in which he explains the concepts:</p> <p><object width="526" height="374"> <param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always"/> <param name="wmode" value="transparent"></param> <param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011X/Blank/LuisVonAhn_2011X-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/LuisVonAhn_2011X-embed.jpg&vw=512&vh=288&ap=0&ti=1295&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=luis_von_ahn_massive_scale_online_collaboration;year=2011;theme=the_rise_of_collaboration;event=TEDxCMU;tag=Internet;tag=collaboration;tag=computers;tag=language;tag=technology;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /> <embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011X/Blank/LuisVonAhn_2011X-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/LuisVonAhn_2011X-embed.jpg&vw=512&vh=288&ap=0&ti=1295&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=luis_von_ahn_massive_scale_online_collaboration;year=2011;theme=the_rise_of_collaboration;event=TEDxCMU;tag=Internet;tag=collaboration;tag=computers;tag=language;tag=technology;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;"></embed> </object></p> <p>Now some screenshots to give you a feeling what Duolingo offers: <div style="width: 488px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-advancement.png"><img src="../images/2012/06/duolingo-advancement.png" alt="" width="488" height="530" class="size-full wp-image-27071"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-translation-300x155.png"><img src="../images/2012/06/duolingo-translation-300x155.png" alt="" width="300" height="155" class="size-medium wp-image-27081"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-typo-300x166.png"><img src="../images/2012/06/duolingo-typo-300x166.png" alt="" width="300" height="166" class="size-medium wp-image-27091"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-speech-300x149.png"><img src="../images/2012/06/duolingo-speech-300x149.png" alt="" width="300" height="149" class="size-medium wp-image-27101"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-photo-to-language-300x167.png"><img src="../images/2012/06/duolingo-photo-to-language-300x167.png" alt="" width="300" height="167" class="size-medium wp-image-27111"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-multiple-choice-300x137.png"><img src="../images/2012/06/duolingo-multiple-choice-300x137.png" alt="" width="300" height="137" class="size-medium wp-image-27121"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-lection-300x173.png"><img src="../images/2012/06/duolingo-lection-300x173.png" alt="" width="300" height="173" class="size-medium wp-image-27131"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/06/duolingo-achivement-300x138.png"><img src="../images/2012/06/duolingo-achivement-300x138.png" alt="" width="300" height="138" class="size-medium wp-image-27141"/></a><p class="wp-caption-text"></p></div> <p>I have 3 invitations left. If you like to test Duolingo, simply post a comment with your email-address. The first three will get the invitations.</p> How to print MIPS assembly code in LaTeX http://martin-thoma.com/how-print-mips-assembly-code-latex Sat, 16 Jun 2012 09:33:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-print-mips-assembly-code-latex <p>If you like to print highlighted MIPS assembly code in LaTeX, you can use the listings package. Sadly, no MIPS language file exits by default in LaTeX, but awg has created one and provides it on his blog. Just download <a href='../images/2012/06/mips.sty_.zip'>mips.sty</a> (thanks to <a href="http://blog.xvx.ca/typesetting-mips-assembly-with-latex">Adam Gordon</a>!) and place it in your project folder. Then you can create a project like this:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/06/mips-latex-highlight.png"><img src="../images/2012/06/mips-latex-highlight.png" alt="" width="512" height="197" class="size-full wp-image-26981"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="text">\documentclass[a4paper,12pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage[utf8]{inputenc} % this is needed for german umlauts \usepackage[ngerman]{babel} % this is needed for german umlauts \usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf \usepackage[margin=2.5cm]{geometry} %layout \usepackage{listings} % needed for the inclusion of source code \usepackage{mips} % the following is needed for syntax highlighting \usepackage{color} \definecolor{dkgreen}{rgb}{0,0.6,0} \definecolor{gray}{rgb}{0.5,0.5,0.5} \definecolor{mauve}{rgb}{0.58,0,0.82} \lstset{ % language=[mips]Assembler, % the language of the code basicstyle=\footnotesize, % the size of the fonts that are used for the code numbers=left, % where to put the line-numbers numberstyle=\tiny\color{gray}, % the style that is used for the line-numbers stepnumber=1, % the step between two line-numbers. If it&#39;s 1, each line % will be numbered numbersep=5pt, % how far the line-numbers are from the code backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color} showspaces=false, % show spaces adding particular underscores showstringspaces=false, % underline spaces within strings showtabs=false, % show tabs within strings adding particular underscores frame=single, % adds a frame around the code rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here)) tabsize=4, % sets default tabsize to 2 spaces captionpos=b, % sets the caption-position to bottom breaklines=true, % sets automatic line breaking breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace title=\lstname, % show the filename of files included with \lstinputlisting; % also try caption instead of title keywordstyle=\color{blue}, % keyword style commentstyle=\color{dkgreen}, % comment style stringstyle=\color{mauve}, % string literal style escapeinside={\%*}{*)}, % if you want to add a comment within your code morekeywords={*,...} % if you want to add more keywords to the set } % this is needed for forms and links within the text \usepackage{hyperref} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Variablen % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\authorName}{Martin Thoma} \newcommand{\tags}{\authorName, my, tags} \title{Aufgabe 5} \author{\authorName} \date{\today} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PDF Meta information % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \hypersetup{ pdfauthor = {\authorName}, pdfkeywords = {\tags}, pdftitle = {This is the title} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE DOCUMENT BEGINS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \lstinputlisting{aufgabe-5.s} \end{document} </code></pre></div> <h2>See also</h2> <ul> <li><a href="../how-to-print-source-code-with-latex/" title="How to print Source Code with LaTeX">How to print Source Code with LaTeX"</a></li> <li><a href="http://blog.xvx.ca/typesetting-mips-assembly-with-latex">Typesetting MIPS Assembly Code in LaTeX</a></li> <li><a href="../add-mips-syntax-highlighting-gedit/" title="Add MIPS syntax highlighting to gEdit">Add MIPS syntax highlighting to gEdit</a></li> </ul> Add MIPS syntax highlighting to gEdit http://martin-thoma.com/add-mips-syntax-highlighting-gedit Sat, 16 Jun 2012 08:27:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/add-mips-syntax-highlighting-gedit <p>I have to code some little programs in MIPS assembly language for university. So I liked to have some syntax highlighting for my favorite editor: gEdit.</p> <p>The following steps were tested on Ubuntu 10.04.4 LTS.</p> <p>This adds MIPS syntax highlighting to gEdit and every editor, that uses gtksourceview.</p> <p>Create the following file: <code>/usr/share/gtksourceview-2.0/language-specs/sal.lang</code></p> <p>Source: GITHub: <a href="https://github.com/Xodarap/Mips-Assembly-Syntax-Highlighting">Xodarap / Mips-Assembly-Syntax-Highlighting</a></p> <p>Copy and paste the following: [xml]&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;!--</p> <p>Author: Ben West Copyright (C) 2010 Ben West edited by Martin Thoma</p> <p>This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> <p>This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.</p> <p>You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</p> <p>--&gt; &lt;!-- Somewhat copied and pasted from nasm.lang --&gt; <language id="mal" _name="MAL" version="2.0" _section="Others"> <metadata> <property name="mimetypes">text/mal</property> <property name="globs">*.s</property> <property name="line-comment-start">#</property> </metadata></p> <div class="highlight"><pre><code class="text language-text" data-lang="text">&lt;styles&gt; &lt;style id=&quot;comment&quot; _name=&quot;Comment&quot; map-to=&quot;def:comment&quot;/&gt; &lt;style id=&quot;error&quot; _name=&quot;Error&quot; map-to=&quot;def:error&quot;/&gt; &lt;style id=&quot;string&quot; _name=&quot;String&quot; map-to=&quot;def:string&quot;/&gt; &lt;style id=&quot;preprocessor&quot; _name=&quot;Preprocessor&quot; map-to=&quot;def:preprocessor&quot;/&gt; &lt;style id=&quot;opcode&quot; _name=&quot;Opcode&quot; map-to=&quot;def:keyword&quot;/&gt; &lt;style id=&quot;register&quot; _name=&quot;Register&quot; map-to=&quot;def:special-char&quot;/&gt; &lt;style id=&quot;type&quot; _name=&quot;Data Type&quot; map-to=&quot;def:type&quot;/&gt; &lt;style id=&quot;escaped-character&quot; _name=&quot;Escaped Character&quot; map-to=&quot;def:special-char&quot;/&gt; &lt;style id=&quot;decimal&quot; _name=&quot;Decimal number&quot; map-to=&quot;def:decimal&quot;/&gt; &lt;style id=&quot;hexadecimal&quot; _name=&quot;Hexadecimal number&quot; map-to=&quot;def:base-n-integer&quot;/&gt; &lt;style id=&quot;label&quot; _name=&quot;Label&quot; map-to=&quot;def:identifier&quot; /&gt; &lt;/styles&gt; &lt;default-regex-options case-sensitive=&quot;false&quot;/&gt; &lt;definitions&gt; &lt;define-regex id=&quot;escaped-character&quot; extended=&quot;true&quot;&gt; \\( # leading backslash [\\\&quot;\&#39;] # escaped character ) &lt;/define-regex&gt; &lt;context id=&quot;mal&quot;&gt; &lt;include&gt; &lt;context id=&quot;preprocessor&quot; style-ref=&quot;preprocessor&quot;&gt; &lt;prefix&gt;^\.&lt;/prefix&gt; &lt;keyword&gt;data&lt;/keyword&gt; &lt;keyword&gt;text&lt;/keyword&gt; &lt;/context&gt; &lt;context id=&quot;comment&quot; style-ref=&quot;comment&quot; end-at-line-end=&quot;true&quot;&gt; &lt;start&gt;#&lt;/start&gt; &lt;include&gt; &lt;context ref=&quot;def:in-line-comment&quot;/&gt; &lt;/include&gt; &lt;/context&gt; &lt;context id=&quot;string&quot; style-ref=&quot;string&quot; end-at-line-end=&quot;true&quot;&gt; &lt;start&gt;&quot;&lt;/start&gt; &lt;end&gt;&quot;&lt;/end&gt; &lt;include&gt; &lt;context id=&quot;escaped-characterw&quot; style-ref=&quot;escaped-character&quot;&gt; &lt;match&gt;\%{escaped-character}&lt;/match&gt; &lt;/context&gt; &lt;/include&gt; &lt;/context&gt; &lt;context id=&quot;string2&quot; style-ref=&quot;string&quot; end-at-line-end=&quot;true&quot;&gt; &lt;start&gt;&#39;&lt;/start&gt; &lt;end&gt;&#39;&lt;/end&gt; &lt;include&gt; &lt;context id=&quot;escaped-characters&quot; style-ref=&quot;escaped-character&quot;&gt; &lt;match&gt;\%{escaped-character}&lt;/match&gt; &lt;/context&gt; &lt;/include&gt; &lt;/context&gt; &lt;context id=&quot;hexadecimal-number&quot; style-ref=&quot;hexadecimal&quot;&gt; &lt;match extended=&quot;true&quot;&gt; (?&amp;amp;lt;![\w\.]) [+-]?0x[0-9a-fA-F]+ (?![\w\.]) &lt;/match&gt; &lt;/context&gt; &lt;context id=&quot;decimal&quot; style-ref=&quot;decimal&quot;&gt; &lt;match extended=&quot;true&quot;&gt; (?&amp;amp;lt;![\w\.]) [0-9]+ (?![\w\.]) &lt;/match&gt; &lt;/context&gt; &lt;context id=&quot;registers&quot; style-ref=&quot;register&quot;&gt; &lt;match extended=&quot;true&quot;&gt; (\$ ( \d|[12]\d|3[12]| (ra)| ([vk][01])| (a[0-3t])| (t[0-9])| (s[0-7p])| ([gsf]p)| (zero) ) )\b &lt;/match&gt; &lt;/context&gt; &lt;context id=&quot;label&quot; style-ref=&quot;label&quot;&gt; &lt;match extended=&quot;true&quot;&gt; ^\w+: &lt;/match&gt; &lt;/context&gt; &lt;!-- Opcodes --&gt; &lt;context id=&quot;opcodes_simple&quot; style-ref=&quot;opcode&quot;&gt; &lt;!-- MAL Opcodes --&gt; &lt;keyword&gt;la&lt;/keyword&gt; &lt;keyword&gt;li&lt;/keyword&gt; &lt;keyword&gt;lw&lt;/keyword&gt; &lt;keyword&gt;lb&lt;/keyword&gt; &lt;keyword&gt;lbu&lt;/keyword&gt; &lt;keyword&gt;sw&lt;/keyword&gt; &lt;keyword&gt;sb&lt;/keyword&gt; &lt;keyword&gt;add(\.s)?&lt;/keyword&gt; &lt;keyword&gt;sub(\.s)?&lt;/keyword&gt; &lt;keyword&gt;mul(\.s)?&lt;/keyword&gt; &lt;keyword&gt;div(\.s)?&lt;/keyword&gt; &lt;keyword&gt;rem&lt;/keyword&gt; &lt;keyword&gt;and&lt;/keyword&gt; &lt;keyword&gt;or&lt;/keyword&gt; &lt;keyword&gt;xor&lt;/keyword&gt; &lt;keyword&gt;nor&lt;/keyword&gt; &lt;keyword&gt;not&lt;/keyword&gt; &lt;keyword&gt;move&lt;/keyword&gt; &lt;keyword&gt;sll&lt;/keyword&gt; &lt;keyword&gt;srl&lt;/keyword&gt; &lt;keyword&gt;sra&lt;/keyword&gt; &lt;keyword&gt;l\.s&lt;/keyword&gt; &lt;keyword&gt;s\.s&lt;/keyword&gt; &lt;keyword&gt;mov\.s&lt;/keyword&gt; &lt;keyword&gt;cvt\.s\.w&lt;/keyword&gt; &lt;keyword&gt;cvt\.w\.s&lt;/keyword&gt; &lt;keyword&gt;mfc0&lt;/keyword&gt; &lt;keyword&gt;mtc0&lt;/keyword&gt; &lt;keyword&gt;mfc1&lt;/keyword&gt; &lt;keyword&gt;mtc1&lt;/keyword&gt; &lt;keyword&gt;b&lt;/keyword&gt; &lt;keyword&gt;beq&lt;/keyword&gt; &lt;keyword&gt;bne&lt;/keyword&gt; &lt;keyword&gt;blt&lt;/keyword&gt; &lt;keyword&gt;bgt&lt;/keyword&gt; &lt;keyword&gt;ble&lt;/keyword&gt; &lt;keyword&gt;bge&lt;/keyword&gt; &lt;keyword&gt;bltz&lt;/keyword&gt; &lt;keyword&gt;bgtz&lt;/keyword&gt; &lt;keyword&gt;blez&lt;/keyword&gt; &lt;keyword&gt;bgez&lt;/keyword&gt; &lt;keyword&gt;bnez&lt;/keyword&gt; &lt;keyword&gt;beqz&lt;/keyword&gt; &lt;keyword&gt;j&lt;/keyword&gt; &lt;keyword&gt;jr&lt;/keyword&gt; &lt;keyword&gt;jal&lt;/keyword&gt; &lt;keyword&gt;jalr&lt;/keyword&gt; &lt;keyword&gt;getc&lt;/keyword&gt; &lt;keyword&gt;putc&lt;/keyword&gt; &lt;keyword&gt;puts&lt;/keyword&gt; &lt;keyword&gt;done&lt;/keyword&gt; &lt;keyword&gt;syscall&lt;/keyword&gt; &lt;keyword&gt;andi&lt;/keyword&gt; &lt;/context&gt; &lt;context id=&quot;types&quot; style-ref=&quot;type&quot;&gt; &lt;prefix&gt;\.&lt;/prefix&gt; &lt;keyword&gt;byte&lt;/keyword&gt; &lt;keyword&gt;word&lt;/keyword&gt; &lt;keyword&gt;asciiz&lt;/keyword&gt; &lt;keyword&gt;ascii&lt;/keyword&gt; &lt;keyword&gt;float&lt;/keyword&gt; &lt;/context&gt; &lt;/include&gt; &lt;/context&gt; &lt;/definitions&gt; </code></pre></div> <p></language>[/xml]</p> <p>That&#39;s it.</p> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/MIPS_architecture">MIPS architecture</a></li> <li>Wikibooks: <a href="http://en.wikibooks.org/wiki/MIPS_Assembly">MIPS Assembly</a></li> <li><a href="http://spimsimulator.sourceforge.net/">SPIM</a> (a MIPS simulator)</li> </ul> Python one-liners for Project Euler http://martin-thoma.com/python-one-liners-for-project-euler Wed, 13 Jun 2012 15:00:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-one-liners-for-project-euler <p>Today, I&#39;ve been trying to get used to <a href="../functional-programming-in-python/" title="Functional Programming in Python">Pythons functional programming tools</a> by solving <a href="http://projecteuler.net/about">Project-Euler</a> tasks. To make them more interesting, I&#39;ve solved them in one line. But I realized, that it is difficult to read online as only about 70 characters get displayed without a scrollbar. So I made multi-line solutions out of them. </p> <p>These snippets are also good examples what&#39;s possible to do with Python and to show that Python is fast.</p> <h2>Problem 24</h2> <blockquote>What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?</blockquote> <div class="highlight"><pre><code class="python"><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">permutations</span><span class="p">,</span> <span class="n">islice</span> <span class="k">print</span> <span class="nb">next</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">permutations</span><span class="p">(</span><span class="s">&quot;0123456789&quot;</span><span class="p">),</span> <span class="mi">999999</span><span class="p">,</span> <span class="mi">999999</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> </code></pre></div> <h2>Problem 29</h2> <blockquote>How many distinct terms are in the sequence generated by `$a^b$` for `$2 \leq a \leq 100$` and `$2 \leq b \leq 100$`?</blockquote> <div class="highlight"><pre><code class="python"><span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">top</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">a</span><span class="o">**</span><span class="n">b</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">top</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">top</span><span class="o">+</span><span class="mi">1</span><span class="p">)]))</span> </code></pre></div> <h2>Problem 34</h2> <blockquote>145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are equal to the sum of the factorial of their digits. Note: as 1! = 1 and 2! = 2 are not sums they are not included.</blockquote> <div class="highlight"><pre><code class="python"><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">factorial</span> <span class="n">l</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">factorial</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="p">)),</span> <span class="p">[</span><span class="n">d</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="s">&quot;0&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span> <span class="k">print</span><span class="p">(</span><span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">==</span> <span class="n">l</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100000</span><span class="p">))))</span> </code></pre></div> <h2>Problem 36</h2> <blockquote>The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2.</blockquote> <div class="highlight"><pre><code class="python"><span class="n">palindrom</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="nb">str</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">x</span><span class="p">))[</span><span class="mi">2</span><span class="p">:]</span> <span class="o">==</span> <span class="nb">str</span><span class="p">(</span><span class="nb">bin</span><span class="p">(</span><span class="n">x</span><span class="p">))[</span><span class="mi">2</span><span class="p">:][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">top</span><span class="p">:</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="nb">filter</span><span class="p">(</span><span class="n">palindrom</span><span class="p">,</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">top</span><span class="o">+</span><span class="mi">1</span><span class="p">)))</span> </code></pre></div> <h2>Problem 48</h2> <blockquote>The series, `$1^1 + 2^2 + 3^3 + ... + 10^{10} = 10405071317$`. Find the last ten digits of the series, `$1^1 + 2^2 + 3^3 + ... + 1000^{1000}$`.</blockquote> <div class="highlight"><pre><code class="python"><span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">top</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="n">i</span><span class="o">**</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">top</span><span class="o">+</span><span class="mi">1</span><span class="p">)]))[</span><span class="o">-</span><span class="mi">10</span><span class="p">:]</span> </code></pre></div> <h2>Problem 52</h2> <blockquote>Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits in some order.</blockquote> <div class="highlight"><pre><code class="python"><span class="n">digits</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">:</span> <span class="nb">set</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="o">*</span><span class="n">p</span><span class="p">))</span> <span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">all</span><span class="p">(</span><span class="n">digits</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="n">digits</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1000000</span><span class="p">)))</span> </code></pre></div> <h2>Problem 53</h2> <blockquote>How many values of `$\binom{n}{r}$`, for `$1 \leq r \leq n \leq 100$`, exceed one-million?</blockquote> <div class="highlight"><pre><code class="python"><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">factorial</span> <span class="k">as</span> <span class="n">f</span> <span class="k">print</span><span class="p">(</span><span class="nb">sum</span><span class="p">((</span><span class="n">f</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="o">*</span> <span class="n">f</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">j</span><span class="p">)))</span> <span class="o">&gt;</span> <span class="mi">1000000</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">101</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">)))</span> </code></pre></div> <h2>Problem 56</h2> <blockquote>Considering natural numbers of the form, `$a^b$`, finding the maximum digital sum.</blockquote> <div class="highlight"><pre><code class="python"><span class="k">print</span> <span class="nb">max</span><span class="p">([</span><span class="nb">sum</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="n">b</span><span class="p">)])</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">100</span><span class="p">)])</span> </code></pre></div> <h2>Problem 97</h2> <blockquote>Find the last ten digits of the non-Mersenne prime: `$28433 \cdot 2^{7830457} + 1$`.</blockquote> <div class="highlight"><pre><code class="python"><span class="k">print</span> <span class="p">(</span><span class="mi">28433</span><span class="o">*</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">7830457</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="p">(</span><span class="mi">10</span><span class="o">**</span><span class="mi">10</span><span class="p">)</span> </code></pre></div> Functional Programming in Python http://martin-thoma.com/functional-programming-in-python Tue, 12 Jun 2012 15:00:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/functional-programming-in-python <p>Python has a few functional programming tools: Lambda functions and the three higher-order functions map, filter and reduce. I&#39;ll explain them now and I&#39;ll give some usage examples.</p> <h2>lambda</h2> <p>A lambda creates an <a href="http://en.wikipedia.org/wiki/Anonymous_function">anonymous function</a>, that means a function without a name. A lambda may have any number of arguments.</p> <p>Here are some examples for lambdas:</p> <div class="highlight"><pre><code class="python"><span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span> </code></pre></div> <p>Output: 49</p> <div class="highlight"><pre><code class="python"><span class="n">g</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="o">*</span><span class="n">y</span> <span class="o">+</span> <span class="nb">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">g</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">g</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">g</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">g</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="n">g</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> </code></pre></div> <p>Output: (3, 3, 1, 56, 36)</p> <div class="highlight"><pre><code class="python"><span class="n">h</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">myVar</span><span class="p">,</span> <span class="n">anotherVar</span><span class="p">:</span> <span class="nb">set</span><span class="p">([</span><span class="n">myVar</span><span class="p">,</span> <span class="n">anotherVar</span><span class="p">])</span> <span class="k">print</span><span class="p">(</span><span class="n">h</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">h</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">h</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;a&#39;</span><span class="p">),</span> <span class="n">h</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> </code></pre></div> <p>Output: (set([1, 2]), set([&#39;a&#39;, 1]), set([&#39;a&#39;]), set([1]))</p> <p>Sometimes you would like to get an if-statement in a lambda. So imagine you would like to make a lambda function like this:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="mi">42</span> <span class="k">elif</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1337</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span> </code></pre></div> <p>This is the way you would do it:</p> <div class="highlight"><pre><code class="python"><span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">==</span><span class="mi">0</span> <span class="ow">and</span> <span class="mi">42</span> <span class="ow">or</span> <span class="n">x</span><span class="o">==</span><span class="mi">1</span> <span class="ow">and</span> <span class="mi">1337</span> <span class="ow">or</span> <span class="mi">0</span> </code></pre></div> <p>(Thanks to <a href="http://eikke.com/python-ifelse-in-lambda/">Ikke&#39;s blog</a> for the hint!)</p> <h2>map(function, sequence)</h2> <p>Map is a function with two parameters. The first parameter is another function, the second is a sequence. Map returns a list. It only applies function to every item of the sequence.</p> <p>Here are some examples:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">square</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">square</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">])</span> </code></pre></div> <p>l = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]</p> <p>This is equivalent to:</p> <div class="highlight"><pre><code class="python"><span class="n">l</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">))</span> </code></pre></div> <p>You can also use more than one list:</p> <div class="highlight"><pre><code class="python"><span class="n">a</span> <span class="o">=</span> <span class="nb">xrange</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </code></pre></div> <p>Output: [0, -9, -16, -21, -24, -25, -24, -21, -16, -9, 0, 11, 24, 39, 56, 75, 96, 119, 144, 171]</p> <h2>reduce(function, sequence)</h2> <p>You can quite often reduce problems to an operation on two elements. Reduce takes two elements from sequence, uses function on them and saves the result. Then it takes the result and another element of the sequence and uses function...</p> <p>Example: Imagine you would like to get the sum of a list. Then you need to add two elements of the list, save the result and add another element, save the result, add another element, ...</p> <div class="highlight"><pre><code class="python"><span class="n">r</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span><span class="mi">63</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span> </code></pre></div> <p>r = 74</p> <p>You can calculate the factorial n! like this:</p> <div class="highlight"><pre><code class="python"><span class="n">fac</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="n">x</span><span class="o">*</span><span class="n">y</span><span class="p">,</span><span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">fac</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">fac</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">fac</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> </code></pre></div> <p>Output: 2 6 3628800</p> <h2>filter(function, sequence)</h2> <p>filter gets all elements from sequence, where function returns true:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">isPrime</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">if</span> <span class="n">element</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">elif</span> <span class="n">element</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">element</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">else</span><span class="p">:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="k">if</span> <span class="n">element</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> <span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">11</span><span class="p">]</span> <span class="n">r</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="n">isPrime</span><span class="p">,</span> <span class="n">myList</span><span class="p">)</span> </code></pre></div> <p>r = [13, 2, 7, 11, 11]</p> <h2>Some more examples</h2> <p>Task: What is the sum of digits of <code>$2^n, n \in \mathbb{N}$</code>?</p> <div class="highlight"><pre><code class="python"><span class="n">sumOfDigits</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">exp</span><span class="p">:</span> <span class="nb">reduce</span><span class="p">(</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="n">exp</span><span class="p">))</span> <span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">sumOfDigits</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">sumOfDigits</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">sumOfDigits</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="n">sumOfDigits</span><span class="p">(</span><span class="mi">10000</span><span class="p">))</span> </code></pre></div> <p>Output: 4 8 7 13561</p> <p>Task: Encode and decode a string in the following way: Split Words by spaces. Every plaintext character gets a two-digit numerical representation in base 16. A is 01, B is 02 and Z is 1A.</p> <div class="highlight"><pre><code class="python"><span class="c"># Thanks to lebenf: http://stackoverflow.com/a/3226719/562769</span> <span class="n">chunks</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">l</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="p">[</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">n</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">),</span> <span class="n">n</span><span class="p">)]</span> <span class="n">decodeWord</span><span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span><span class="o">+</span><span class="mi">64</span><span class="p">),</span><span class="n">chunks</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="mi">2</span><span class="p">)))</span> <span class="n">decode</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">decodeWord</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)))</span> <span class="n">encodeWord</span><span class="o">=</span> <span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="s">&quot;</span><span class="si">%.2X</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">-</span><span class="mi">64</span><span class="p">),</span> <span class="n">p</span><span class="p">))</span> <span class="n">encode</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="s">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">encodeWord</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)))</span> <span class="n">cipher</span> <span class="o">=</span> <span class="n">encode</span><span class="p">(</span><span class="s">&quot;HELLO WORLD&quot;</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Cipher Text: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">cipher</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Plain Text: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">decode</span><span class="p">(</span><span class="n">cipher</span><span class="p">))</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <ul> <li><a href="http://en.wikipedia.org/wiki/Lambda_calculus">Lambda calculus</a></li> <li><a href="http://en.wikipedia.org/wiki/Filter_(higher-order_function)">filter</a></li> <li><a href="http://en.wikipedia.org/wiki/Map_(higher-order_function)">map</a></li> <li><a href="http://en.wikipedia.org/wiki/Reduce_(higher-order_function)">reduce</a></li> </ul> </li> <li><a href="http://www.python-kurs.eu/lambda.php">Python-Kurs: Lambda, filter, reduce und map</a> (German)</li> </ul> Warum kann der Mond keine Atmosphäre haben? http://martin-thoma.com/warum-kann-der-mond-keine-atmosphare-haben Sun, 10 Jun 2012 13:22:02 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/warum-kann-der-mond-keine-atmosphare-haben <p>Ich lese gerade das Buch 2025 von Frank Sch&auml;tzing, in dem es um den Abbau des Isotops <a href="http://de.wikipedia.org/wiki/Helium-3#Kernfusion"><sup>3</sup>He</a> geht. Es wird auch kurz erw&auml;hnt, dass es auf dem Mond keine Atmosph&auml;re geben kann. Warum ist das so?</p> <h2>Die kurze Antwort</h2> <p>Der Mond ist leicht. Er &uuml;bt deshalb eine weitaus geringere Anziehungskraft aus, als die Erde. Deshalb ist die Geschwindigkeit, die ben&ouml;tigt wird um den Mond zu verlassen auch um einiges niedriger als die Fluchtgeschwindigkeit der Erde. Gleichzeitig ist es auf dem Mond sehr hei&szlig;, die einzelnen Gas-Teilchen bewegen sich also sehr schnell. Das bedeutet, sie k&ouml;nnen den Mond verlassen.</p> <h2>Die lange Antwort</h2> <h3>Definitionen und Gr&ouml;&szlig;en</h3> <p>Die <a href="http://de.wikipedia.org/wiki/Atmosph%C3%A4re_(Astronomie)">Atmosph&auml;re</a> bezeichnet die gasf&ouml;rmige H&uuml;lle um einen Himmelsk&ouml;rper.</p> <p>Die <a href="http://de.wikipedia.org/wiki/Fluchtgeschwindigkeit#Zweite_kosmische_Geschwindigkeit_oder_Fluchtgeschwindigkeit">Fluchtgeschwindigkeit</a> </p> <p>Der Mond hat Temperaturen von bis zu 130 &deg;C. Das sind 403,15 Kelvin. Die Masse des <a href="http://de.wikipedia.org/wiki/Mond">Mondes</a> betr&auml;gt <code>$7,349 \cdot 10^{22} kg$</code>, der Radius betr&auml;gt 1738 km. Die Atommasse von Sauerstoff betr&auml;gt <code>$15,999 u$</code>.</p> <h3>Mittlere Geschwindigkeit eines Gases</h3> <p>Die mittlere Geschwindigkeit eines Gases berechnet sich wie folgt: <code>$E_{Kin} = \bar E_i$</code> <code>$\Leftrightarrow \frac{1}{2} \cdot m \cdot v^2 = \frac{3}{2} \cdot k \cdot T$</code>, wobei k die <a href="http://de.wikipedia.org/wiki/Boltzmann-Konstante">Boltzmann-Konstante</a> ist und T die thermodynamische Temperatur <code>$\Leftrightarrow v^2 = \frac{3 \cdot k \cdot T}{m}$</code> Da wir die mittlere Geschwindigkeit eines Gasteilchens wollen, m&uuml;ssen wir die <a href="http://de.wikipedia.org/wiki/Maxwell-Boltzmann-Verteilung">Maxwell-Geschwindigkeitsverteilung</a> beachten: <code>$\Rightarrow \bar v = \sqrt{\frac{8}{2 \cdot \pi}} \sqrt{\frac{3 \cdot k \cdot T}{m}}$</code> <code>$\Leftrightarrow \sqrt{\frac{12 \cdot k \cdot T}{\pi \cdot M \cdot u}}$</code>, mit M als <a href="http://de.wikipedia.org/wiki/Atommasse">Atommasse</a> und u als <a href="http://de.wikipedia.org/wiki/Atomare_Masseneinheit">atomare Masseneinheit</a>.</p> <h3>Berechnung der Fluchtgeschwindigkeit</h3> <p><code>$v_{fl} = \sqrt{\frac{2 \cdot G \cdot m}{r}}$</code>, wobei G die <a href="http://de.wikipedia.org/wiki/Gravitationskonstante">Gravitationskonstante</a>, m die Masse des Himmelsk&ouml;rpers und r dessen Radius. Siehe auch: <a href="http://de.wikipedia.org/wiki/Kosmische_Geschwindigkeiten">1. Kosmische Geschwindigkeit</a>.</p> <h3>Berechnung</h3> <p>Nun ben&ouml;tigen wir noch folgende Faustregel:</p> <blockquote>Eine Faustregel besagt, dass sich in der Atmosph&auml;re eines Planeten nur solche Gase befinden, deren mittlere Geschwindigkeit kleiner als ein Sechstel der Fluchtgeschwindigkeit f&uuml;r diesen Planeten ist.</blockquote> <p>Quelle: <a href="http://www.leifiphysik.de/web_ph12/musteraufgaben/08gastheorie/atmos/atmos.htm">Leifi-Physik</a></p> <p><code>$v_{fl}(\text{Mond}) \approx \sqrt{\frac{2 \cdot (6,67384 \cdot 10^{-11} \cdot \frac{m^3}{kg \cdot s^2}) \cdot (7,349 \cdot 10^{22} kg)}{1738000 m}} \approx 2375,70 \frac{m}{s}$</code> <code>$\Rightarrow \frac{1}{6} v_{fl}(\text{Mond}) \approx 395,95$</code></p> <p>Die mittlere Geschwindigkeit von Sauerstoff bei 130 &deg;C ist: <code>$\bar v (O_2, \text{Mond}) \approx \sqrt{\frac{12 \cdot (1,3806488 \cdot 10^{-23}) \cdot (130 + 273,15)}{\pi \cdot (2 \cdot 15,999) \cdot (1,660538921 \cdot 10^{-27})}} \cdot \frac{m}{s} \approx 632,56 \frac{m}{s}$</code> Achtung: Ein Sauerstoffmolek&uuml;l hat 2 Atome!</p> <p><code>$\Rightarrow \frac{1}{6} v_{fl}(\text{Mond}) &lt; \bar v (O_2, \text{Mond}) \Rightarrow$</code> Langfristig kann es keine sauerstoffhaltige Atmosph&auml;re auf dem Mond geben.</p> Cool features of Python http://martin-thoma.com/cool-features-of-python Fri, 08 Jun 2012 15:30:10 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/cool-features-of-python <p>A friend wanted to know why I enjoy programming in Python so much more than programming in other languages. So I will describe some special features of Python which make it much easier to quickly implement algorithms.</p> <p>I also made drafts how the tasks would be solved in most programming languages. When I say most, I mean most languages that are widely spread (so C/C++/Java is much more important than almost any other languages combined). I know that those tasks would be solved completely different in functional programming languages.</p> <h2>Rapid, readable programming</h2> <h3>Intuitive looping through lists</h3> <p>You can loop through every list-like datastructure like this:</p> <div class="highlight"><pre><code class="python"><span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="n">element</span><span class="p">)</span> </code></pre></div> <h3>Arbitrary Integer size</h3> <p><strong>Description</strong>: Print the sum of the digits of <code>$2^{100000}$</code>. <strong>Java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.math.BigInteger</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">BigInteger</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BigInteger</span><span class="o">(</span><span class="s">&quot;2&quot;</span><span class="o">);</span> <span class="n">a</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="na">pow</span><span class="o">(</span><span class="mi">100000</span><span class="o">);</span> <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">a</span><span class="o">.</span><span class="na">toString</span><span class="o">().</span><span class="na">length</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="n">sum</span> <span class="o">+=</span> <span class="n">a</span><span class="o">.</span><span class="na">toString</span><span class="o">().</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">);</span> <span class="o">}</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">sum</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>Python</strong>: (was much faster in both computation and programming time!)</p> <div class="highlight"><pre><code class="python"><span class="n">big</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">100000</span> <span class="n">sumOfDigits</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">digit</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">big</span><span class="p">):</span> <span class="n">sumOfDigits</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">digit</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">sumOfDigits</span><span class="p">)</span> </code></pre></div> <p>Python has no need for a special class as it has arbitrary length integers (see <a href="http://docs.python.org/release/3.1.5/c-api/long.html">source</a>)</p> <h3>Swich values of variables</h3> <p><strong>Description</strong>: You want to make sure, that variable a is smaller than b (<code>$a &lt; b$</code>). <strong>Most languages</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">tmp</span> <span class="o">=</span> <span class="n">a</span> <span class="n">a</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">tmp</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">),</span> <span class="nb">max</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span> </code></pre></div> <h3>Return more than one variable</h3> <p><strong>Description</strong>: Evaluate <code>$f: \mathbb{R}^2 \rightarrow \mathbb{R}^3, f(x, y) := (x^2, y^2, x+y)$</code> <strong>Most languages</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">double</span> <span class="n">function</span><span class="p">(</span><span class="n">double</span> <span class="n">x</span><span class="p">,</span> <span class="n">double</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="n">double</span> <span class="n">returnValues</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span> <span class="n">returnValues</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="n">returnValues</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="p">;</span> <span class="n">returnValues</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">;</span> <span class="k">return</span> <span class="n">returnValues</span><span class="p">;</span> <span class="p">}</span> <span class="n">double</span> <span class="n">values</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Part 1: </span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Part 3: </span><span class="si">%.2f</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">values</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="k">def</span> <span class="nf">function</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">)</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Part 1: </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">a</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Part 3: </span><span class="si">%.2f</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">b</span><span class="p">)</span> </code></pre></div> <p>This is called &quot;Argument Unpacking&quot;. In fact it does return only one variable (a tuple), but it creating the tuple is so easy that it does not feel like creating another variable.</p> <h3>Short initialisation</h3> <p><strong>Description</strong>: Get a string representation of a list from the standard library <strong>Java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">test</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">myList</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;();</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> <span class="n">myList</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">7</span><span class="o">);</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">myList</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span> <span class="k">print</span><span class="p">(</span><span class="n">myList</span><span class="p">)</span> </code></pre></div> <p>Both get the same result.</p> <h3>Chaining Comparisons</h3> <p>Description: You would like to check if <code>$x \in [-5, 42]$</code>. <strong>Most languages</strong>:</p> <div class="highlight"><pre><code class="java"><span class="k">if</span> <span class="o">(-</span><span class="mi">5</span> <span class="o">&lt;=</span> <span class="n">x</span> <span class="o">&amp;</span><span class="n">amp</span><span class="o">;&amp;</span><span class="n">amp</span><span class="o">;</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">42</span><span class="o">)</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="k">if</span> <span class="o">-</span><span class="mi">5</span> <span class="o">&lt;=</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">42</span><span class="p">:</span> </code></pre></div> <h3>Enumeration</h3> <p><strong>Description</strong>: You have a list and you would like to print it, prefixed with the index in the list. <strong>Java</strong>:</p> <div class="highlight"><pre><code class="java"><span class="n">List</span> <span class="n">myList</span> <span class="o">=</span> <span class="o">(</span><span class="n">List</span> <span class="n">initialisation</span> <span class="n">and</span> <span class="n">assignment</span><span class="o">,</span> <span class="n">multiple</span> <span class="n">lines</span><span class="o">)</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">element</span> <span class="o">:</span> <span class="n">myList</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">&quot;%i: %i&quot;</span><span class="o">,</span> <span class="n">i</span><span class="o">,</span> <span class="n">element</span><span class="o">);</span> <span class="n">i</span><span class="o">++;</span> <span class="o">}</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span> <span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">element</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">myList</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%i</span><span class="s">: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nr</span><span class="p">,</span> <span class="n">element</span><span class="p">))</span> </code></pre></div> <h3>Named String formatting</h3> <p>Python allows you to give parameters names:</p> <div class="highlight"><pre><code class="python"><span class="k">print</span><span class="p">(</span><span class="s">&quot;The </span><span class="si">%(foo)s</span><span class="s"> is </span><span class="si">%(bar)i</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="p">{</span><span class="s">&#39;foo&#39;</span><span class="p">:</span> <span class="s">&#39;answer&#39;</span><span class="p">,</span> <span class="s">&#39;bar&#39;</span><span class="p">:</span><span class="mi">42</span><span class="p">})</span> </code></pre></div> <h3>any() and all()</h3> <p><strong>Description</strong>: You have a very long list and you want to know, if a prime is in this list. <strong>Most languages</strong>:</p> <div class="highlight"><pre><code class="java"><span class="n">List</span> <span class="n">myList</span> <span class="o">=</span> <span class="o">(</span><span class="n">List</span> <span class="n">initialisation</span> <span class="n">and</span> <span class="n">assignment</span> <span class="n">of</span> <span class="n">many</span> <span class="n">values</span><span class="o">)</span> <span class="kt">boolean</span> <span class="n">isPrimePresent</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">element</span> <span class="o">:</span> <span class="n">myList</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">isPrime</span><span class="o">(</span><span class="n">element</span><span class="o">))</span> <span class="o">{</span> <span class="n">isPrimePresent</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="k">if</span> <span class="o">(!</span><span class="n">isPrimePresent</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;The list did not containe a prime.&quot;</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">isPrime</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">myList</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;The list did not contain a prime&quot;</span><span class="p">)</span> </code></pre></div> <p>See also: <a href="http://stackoverflow.com/questions/10958874/exists-keyword-in-python">StackOverflow answer from steveha</a>.</p> <h2>Testing and Documentation</h2> <h3>Doctest</h3> <p>You can write Documentation and Unit-Tests at the same time! Take a look at <a href="http://docs.python.org/library/doctest.html">doctest &mdash; Test interactive Python examples</a>.</p> <h2>The Rest</h2> <h3>Lists and Generators</h3> <p>I already wrote an article about <a href="../understanding-python-lists/" title="Understanding Python Lists">Python Lists</a> and <a href="../python-generators/" title="Python Generators">Python Generators</a>. I love Pythons lists :-)</p> <h3>for ... else</h3> <p><strong>Description</strong>: You have a very long list and you want to know, if a prime is in this list. <strong>Most languages</strong>:</p> <div class="highlight"><pre><code class="java"><span class="n">List</span> <span class="n">myList</span> <span class="o">=</span> <span class="o">(</span><span class="n">List</span> <span class="n">initialisation</span> <span class="n">and</span> <span class="n">assignment</span> <span class="n">of</span> <span class="n">many</span> <span class="n">values</span><span class="o">)</span> <span class="kt">boolean</span> <span class="n">isPrimePresent</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">element</span> <span class="o">:</span> <span class="n">myList</span><span class="o">)</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">isPrime</span><span class="o">(</span><span class="n">element</span><span class="o">))</span> <span class="o">{</span> <span class="n">isPrimePresent</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="k">break</span><span class="o">;</span> <span class="o">}</span> <span class="o">}</span> <span class="k">if</span> <span class="o">(!</span><span class="n">isPrimePresent</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;The list did not containe a prime.&quot;</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <p><strong>Python</strong>:</p> <div class="highlight"><pre><code class="python"><span class="n">myList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span> <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">myList</span><span class="p">:</span> <span class="k">if</span> <span class="n">isPrime</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">break</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;The list did not containe a prime.&quot;</span><span class="p">)</span> </code></pre></div> <h3>Step through lists</h3> <p><strong>Description</strong>: Print only every n-th element of an iterable.</p> <div class="highlight"><pre><code class="python"><span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">myList</span><span class="p">[::</span><span class="n">n</span><span class="p">]:</span> <span class="k">print</span> <span class="n">elemenet</span> </code></pre></div> <h3>Dynamically add properties to objects and classes</h3> <div class="highlight"><pre><code class="python"><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="n">value</span> <span class="o">=</span> <span class="mi">3</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Node</span><span class="p">()</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Node</span><span class="p">()</span> <span class="k">print</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="sd">&quot;&quot;&quot; colorize the node! &quot;&quot;&quot;</span> <span class="c">#print a.color ==&gt; AttributeError</span> <span class="c"># thats ok, although the object originally had no attribute &quot;color&quot;</span> <span class="n">a</span><span class="o">.</span><span class="n">color</span> <span class="o">=</span> <span class="s">&quot;white&quot;</span> <span class="k">print</span> <span class="n">a</span><span class="o">.</span><span class="n">color</span> <span class="c"># You can even add a property to the class</span> <span class="n">Node</span><span class="o">.</span><span class="n">special</span> <span class="o">=</span> <span class="s">&quot;here is it&quot;</span> <span class="k">print</span> <span class="n">b</span><span class="o">.</span><span class="n">special</span> </code></pre></div> <h3>Imaginary numbers</h3> <p>Python directly supports usage of imaginary numbers:</p> <div class="highlight"><pre><code class="python"><span class="p">(</span><span class="mi">2j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> </code></pre></div> <p>Output: (-3+4j)</p> <h2>Read also</h2> <p><a href="http://docs.python.org/tutorial/introduction.html">An Informal Introduction to Python</a></p> LaTeX-Vorlage für den Semesterbericht der Studienstiftung http://martin-thoma.com/latex-vorlage-fur-den-semesterbericht-der-studienstiftung Mon, 04 Jun 2012 05:31:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/latex-vorlage-fur-den-semesterbericht-der-studienstiftung <p>Stipendiaten der Studienstiftung des deutschen Volkes m&uuml;ssen jedes Semester einen Studienbericht schreiben. </p> <p>Damit sich andere Stipendiaten nicht auch jedes mal die Vorlage erstellen m&uuml;ssen, stelle ich meine LaTeX-Vorlage hier bereit. Wenn ihr Verbesserungsvorschl&auml;ge habt, k&ouml;nnt ihr mir gerne eine Email schreiben (info@martin-thoma.de) oder einen Kommentar hinterlassen.</p> <h2>Wozu dient der Semesterbericht?</h2> <p>Im Daidalosnet steht dazu:</p> <blockquote>Der Studienbericht bietet Gelegenheit, &uuml;ber die wesentlichen Inhalte und Erfahrungen des letzten Semesters nachzudenken sowie die beiden Leser - den Vertrauensdozenten und den Referenten - zu informieren und an Reflexionen und Bewertungen teilnehmen zu lassen. Ohne die Berichte w&auml;re die Studienstiftung weniger oder kaum in der Lage, ein aktuelles Wissenschaftliches Programm zu bieten und die Stipendiaten verl&auml;sslich zu beraten. Nach der Lekt&uuml;re des Berichtes sollten die Leser ein Bild vom Verlauf des Studiums und von fachlichen und au&szlig;erfachlichen Aktivit&auml;ten gewonnen haben. Ein Umfang von zwei bis drei Seiten ist angemessen.</blockquote> <h2>Wer bekommt wann den Studienbericht?</h2> <blockquote>Stipendiaten, die endg&uuml;ltig in die Studienstiftung aufgenommen worden sind, schreiben Jahresberichte jeweils zum <strong>1. August</strong>. Stipendiaten vor der endg&uuml;ltigen Aufnahme schreiben Semesterberichte, jeweils zum <strong>1. M&auml;rz</strong> und zum 1. August.</blockquote> <p>Mit dem Semesterbericht f&uuml;r das WS 2012/2013 soll der Bericht nicht mehr an den zust&auml;ndigen Referenten bzw. Vertrauensdozenten geschickt werden, sondern direkt ins Daidalosnet geladen werden: </p> <blockquote>Bitte laden Sie Ihren Bericht als PDF-Dokument im Daidalosnet hoch. Sie finden die Eingabemaske in Ihrem eigenen Kurzprofil ("<strong>Meine Einstellungen</strong>" unten rechts) - hier ist in der unteren Bildschirmh&auml;lfte die Rubrik "<strong>Studienberichte</strong>" zu finden. Wenn Sie hier einen als "offen" gekennzeichneten Eintrag finden, m&uuml;ssen Sie uns einen Bericht zukommen lassen - bitte folgen Sie dem Link in der Zeile unter "offen", um zur Eingabemaske zu gelangen. Sowohl Ihr/e Referent/in als auch Ihr/e Vertrauensdozent/in erhalten automatisch eine Kopie des Berichts per E-Mail.</blockquote> <p><h3>Wer ist mein zust&auml;ndiger Referent bzw. mein Vertrauensdozent?</h2> <ol> <li>Logge dich im <a href="https://www.daidalosnet.de/">daidalosnet</a> ein.</li> <li>Klicke rechts unten auf &quot;Meine Einstellungen&quot;.</li> <li>Klicke auf &quot;Gespeicherte Daten&quot;.</li> <li>Nun sollte &quot;Referent/in&quot; sowie &quot;aktueller Vertrauensdozent&quot; dort stehen.</li> </ol></p> <h2>Die Vorlage</h2> <p>Hier ist die Vorlage mit Blindtext als <a href='../images/2012/06/semesterbericht-ws-2011.pdf'>PDF</a>.</p> <p>Makefile:</p> <div class="highlight"><pre><code class="text">DOKUMENT = semesterbericht-martin-thoma-ws-2011 make: pdflatex `$(DOKUMENT).tex -output-format=pdf pdflatex $`(DOKUMENT).tex -output-format=pdf make clean clean: rm -rf $(TARGET) *.class *.html *.log *.aux *.out </code></pre></div> <p>LaTeX:</p> <div class="highlight"><pre><code class="text">\documentclass[a4paper,12pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage[utf8]{inputenc} % this is needed for umlauts \usepackage[ngerman]{babel} % this is needed for umlauts \usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf \usepackage[margin=2.5cm]{geometry} %layout \usepackage{fancyhdr} % needed for the footer \usepackage{lastpage} % needed for the footer \usepackage{hyperref} % links im text \usepackage{color, colortbl} % farbige Tabellenzellen \usepackage{tabularx} \clubpenalty = 10000 % Schusterjungen verhindern \widowpenalty = 10000 % Hurenkinder verhindern %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Hier eigene Daten einf&amp;uuml;gen % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\Jahr}{2011/2012} % Typ: &quot;2011 / 2012&quot; oder &quot;2012&quot; \newcommand{\Semester}{Wintersemester} % &quot;Wintersemester&quot; oder &quot;Sommersemester&quot; \newcommand{\Datum}{\today} % Wann wurde der Bericht erstellt? \newcommand{\Semesteranzahl}{1} % Das Fachsemester als Zahl \newcommand{\Gesamtsemesterzahl}{6} % Die gesamte Anzahl an Semestern \newcommand{\Abschluss}{Bachelor} \newcommand{\Studienfach}{Informatik} \newcommand{\University}{KIT} \newcommand{\Nachname}{Thoma} \newcommand{\Vorname}{Martin} \newcommand{\Strasse}{Musterstra&amp;szlig;e} \newcommand{\Hausnummer}{123} \newcommand{\PLZ}{76131} \newcommand{\Ort}{Karlsruhe} \newcommand{\Email}{info@martin-thoma.de} \newcommand{\Vertrauensdozent}{Prof. Dr. &lt;a href=&#39;../images/2012/06/semesterbericht-ws-2011.pdf&#39;&gt;Semesterbericht WS 2011&lt;/a&gt;Mustermann} \newcommand{\Referent}{Dr. Alice Brown} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \hypersetup{ pdfauthor = {\Vorname~\Nachname}, pdfkeywords = {Studienstiftung; KIT; \Vorname~\Nachname}, pdftitle = {Semesterbericht von~\Vorname~\Nachname~-~\Semester~\Jahr} } \pagestyle{fancy} \fancyhf{} \renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{0pt} \fancyfoot[R]{Seite~\thepage~von \pageref{LastPage}} \definecolor{LightCyan}{rgb}{0.88,1,1} \pagenumbering{arabic} \begin{document} \title{Semesterbericht &amp;uuml;ber das \Semester \Jahr} \author{\Vorname \Nachname} \date{\Datum} \section*{Semesterbericht &amp;uuml;ber das \Semester~\Jahr} \begin{tabularx}{\textwidth}{@{}llllX} Name, Vorname: &amp;amp; \Nachname, \Vorname &amp;amp; Universit&amp;auml;t &amp;amp; \University \\ Semesteradresse: &amp;amp;\Strasse~\Hausnummer &amp;amp; Studienfach &amp;amp; \Studienfach \\ &amp;amp;\PLZ~\Ort~~~~~~~ &amp;amp; Semesterzahl &amp;amp; \Semesteranzahl~von~\Gesamtsemesterzahl \\ &amp;amp; &amp;amp; Geplanter Abschluss &amp;amp; \Abschluss \\ &amp;amp; &amp;amp; Vertrauensdozent &amp;amp; \Vertrauensdozent \\ E-Mail &amp;amp;\Email &amp;amp; Referent &amp;amp; \Referent \\ \end{tabularx} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Hier bitte Text einf&amp;uuml;gen! % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection*{Einleitende Zusammenfassung} \subsubsection*{1. Auf diesem Stand ist jetzt mein Studium:} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \subsubsection*{2. Das war f&amp;uuml;r mich au&amp;szlig;erhalb des Studiums von gro&amp;szlig;er Bedeutung:} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer \subsubsection*{3. F&amp;uuml;r das n&amp;auml;chste Semester habe ich folgende Pl&amp;auml;ne:} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \newpage Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam: \begin{table}[h] \begin{tabular}{| l | c | c | l |} \hline \textbf{Modulbezeichnung} &amp;amp; \textbf{SWS} &amp;amp; \textbf{LP} &amp;amp; \textbf{Klausur} \\ \hline \hline \rowcolor{yellow} Lineare Algebra und Analytische Geometrie &amp;amp; 8 &amp;amp; 9 &amp;amp; Im SS 2012 \\ \rowcolor{yellow} Analysis I &amp;amp; 8 &amp;amp; 9 &amp;amp; Im SS 2012 \\ \rowcolor{yellow} Grundbegriffe der Informatik &amp;amp; 5 &amp;amp; 4 &amp;amp; Am 05. M&amp;auml;rz 2012 \\ \rowcolor{yellow} Programmieren &amp;amp; 4 &amp;amp; 5 &amp;amp; Abschlussaufgabe l&amp;auml;uft \\ \rowcolor{LightCyan} Betriebssysteme und Systemarchitektur &amp;amp; 6 &amp;amp; 6 &amp;amp; Am 26. M&amp;auml;rz 2012 \\ \rowcolor{LightCyan} Theoretische Grundlagen der Informatik &amp;amp; 6 &amp;amp; 6 &amp;amp; Benotung steht aus \\ \rowcolor{LightCyan} Wahrscheinlichkeitstheorie f&amp;uuml;r Informatiker &amp;amp; 3 &amp;amp; 4,5 &amp;amp; mit 1,3 bestanden \\ \hline \hline Gesamt &amp;amp; 40 &amp;amp; 43,5 &amp;amp; \\ \hline \end{tabular} \begin{tabular}{| l | l | l | l |} \hline \cellcolor{yellow} &amp;amp; Teil der Orientierungspr&amp;uuml;fung &amp;amp; \cellcolor{LightCyan} &amp;amp; Pflichtmodul des 3. Semesters \\ \hline \end{tabular} \end{table} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer.\\ \\ \Ort, der \Datum\\ \\ \Vorname~\Nachname \end{document} </code></pre></div> How many IPv6 adresses exist? http://martin-thoma.com/how-many-ipv6-adresses-exist Fri, 01 Jun 2012 16:43:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-many-ipv6-adresses-exist <h2>Some general information</h2> <iframe width="512" height="288" src="http://www.youtube.com/embed/-Uwjt32NvVA" frameborder="0" allowfullscreen></iframe> <p>A typical IPv4 adress in a lokal network looks like this: <code>192.168.0.1</code> This is <code>11000000 10101000 00000000 00000001</code> in binary octets. You can easily see that it has 32 bits. As one bit may have two values - 0 or 1 - there are <code>$2^{32} = 4,294,967,296 \approx 4.3 \cdot 10^9$</code> possible addresses. The internet needs IP-addresses to know which information should be sent to whom. So only 4.3 billion devices can be conntected to the internet. Devices are home computers (your PCs), servers (of big companies like Google or Facebook), Smartphones. So we are currently getting out of addresses. To solve this problem, IPv6 was introduced.</p> <h2>Pure Numbers</h2> <p>IPv6 has 128 bit. This means there are the number of addresses is: <code>$2^{128} = 340282366920938463463374607431768211456 \approx 3.4 \cdot 10^{38}$</code></p> <p>Quite a lot.</p> <h2>Playing with numbers</h2> <p>Imagine the world had 10 billion people (<code>$10,000,000 = 10 \cdot 10^9 = 10^{10}$</code>). Imagine everyone bought 6 smartphones, 5 computers, 1 car, 4 tablet, 4 car radios in every year. That would be 20 internet devices for every person every year. Now you could give every device a unique address for much, much more than billion billon years! The sun is going to get a <a href="http://en.wikipedia.org/wiki/Red_giant">red giant</a> in about 4 billion years, so this is nothing we have to worry about. Calculation: <code>$\frac{2^{128}}{10^{10} \cdot 20} \approx 1.7 \cdot 10^{34}$</code></p> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Internet_Protocol">Internet Protocol</a></li> <li>UbuntuUsers: <a href="http://ikhaya.ubuntuusers.de/2012/06/01/ipv6-ueberblick/">IPv6</a> (German)</li> </ul> Vectors in C++ http://martin-thoma.com/vectors-in-cpp Mon, 28 May 2012 10:40:52 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/vectors-in-cpp <h2>Minimal Example</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="cp">#include &lt;algorithm&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// create an empty vector</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myVector</span><span class="p">;</span> <span class="c1">// insert one element</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// insert another element</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// insert more elements</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1337</span><span class="p">);</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">31415</span><span class="p">);</span> <span class="c1">// insert an element which was there before</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// get the third element</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;third element: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myVector</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// removes the element at position number 6</span> <span class="n">myVector</span><span class="p">.</span><span class="n">erase</span> <span class="p">(</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// removes the element with the value 4</span> <span class="n">myVector</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">remove</span><span class="p">(</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="mi">4</span><span class="p">),</span> <span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">());</span> <span class="c1">// iterate over the vector</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">myIt</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="n">myIt</span><span class="o">=</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">myIt</span> <span class="o">!=</span> <span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">myIt</span><span class="o">++</span><span class="p">){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">myIt</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash">third element: 1337 5 1337 42 31415 </code></pre></div> <h2>Vector initialization</h2> <div class="highlight"><pre><code class="cpp"><span class="c1">// create a vector with 100 zeroes</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myVector</span> <span class="p">(</span><span class="mi">100</span><span class="p">);</span> </code></pre></div> <div class="highlight"><pre><code class="cpp"><span class="c1">// create a vector which has 42 times the integer 100</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myVector</span> <span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span> </code></pre></div> <h2>Nested Vectors</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// create an empty vector</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">myVector</span> <span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// add elements</span> <span class="n">myVector</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="n">myVector</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="n">myVector</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span> <span class="c1">// iterate over the vector</span> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">myIt</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">innerIt</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="n">myIt</span><span class="o">=</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">myIt</span> <span class="o">!=</span> <span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">myIt</span><span class="o">++</span><span class="p">){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Inner vector: &quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="n">innerIt</span><span class="o">=</span><span class="n">myIt</span><span class="o">-&gt;</span><span class="n">begin</span><span class="p">();</span><span class="n">innerIt</span><span class="o">!=</span><span class="n">myIt</span><span class="o">-&gt;</span><span class="n">end</span><span class="p">();</span><span class="n">innerIt</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">innerIt</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Output:</p> <div class="highlight"><pre><code class="bash">Inner vector: 1 2 Inner vector: 3 Inner vector: Inner vector: </code></pre></div> <h3>Initialize nested vectors</h3> <div class="highlight"><pre><code class="cpp"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myInnerVector</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">myVector</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="n">myInnerVector</span><span class="p">);</span> </code></pre></div> <p>Output with the script above:</p> <div class="highlight"><pre><code class="bash">Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 Inner vector: 3 3 3 3 3 </code></pre></div> <p>You could also do it this way:</p> <div class="highlight"><pre><code class="cpp"><span class="n">vector</span><span class="o">&lt;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">myVector</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">3</span><span class="p">));</span> </code></pre></div> <h2>Some more</h2> <h3>Reverse the order</h3> <p>With reverse (<a href="http://www.cplusplus.com/reference/algorithm/reverse/">source</a>):</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;algorithm&gt;</span> <span class="cp">#include &lt;vector&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myvector</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span> <span class="c1">// set some values:</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">myVector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="c1">// 1 2 3 4 5 6 7 8 9</span> <span class="n">reverse</span><span class="p">(</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">());</span> <span class="c1">// 9 8 7 6 5 4 3 2 1</span> <span class="c1">// print out content:</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;myVector contains:&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="n">it</span><span class="o">=</span><span class="n">myVector</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span><span class="o">!=</span><span class="n">myVector</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <ul> <li>C++ Reference: <a href="http://www.cplusplus.com/reference/stl/vector/">General information</a> and <a href="http://www.cplusplus.com/reference/stl/vector/vector/">example</a></li> <li><a href="http://stackoverflow.com/questions/3131991/iterating-over-2-dimensional-stl-vector-c">Iterating over 2-dimensional STL vector C++</a></li> </ul> Sets in C++ http://martin-thoma.com/sets-in-cpp Mon, 28 May 2012 10:08:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sets-in-cpp <div class="highlight"><pre><code class="cpp language-cpp" data-lang="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;set&gt;</span> <span class="cp">#include &lt;iterator&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// create an empty set of integers</span> <span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">mySet</span><span class="p">;</span> <span class="c1">// insert one element</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// insert another element</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// insert more elements</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">1337</span><span class="p">);</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">31415</span><span class="p">);</span> <span class="c1">// insert an element which was there before</span> <span class="n">mySet</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// check if 4 is in set</span> <span class="kt">bool</span> <span class="n">is_in</span> <span class="o">=</span> <span class="n">mySet</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="o">!=</span> <span class="n">mySet</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;4 is in mySet: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">is_in</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">is_in</span> <span class="o">=</span> <span class="n">mySet</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="o">!=</span> <span class="n">mySet</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;6 is in mySet: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">is_in</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// iterate over the set</span> <span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">myIt</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="n">myIt</span><span class="o">=</span><span class="n">mySet</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">myIt</span> <span class="o">!=</span> <span class="n">mySet</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">myIt</span><span class="o">++</span><span class="p">){</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">myIt</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>As find is logarithmic in <code>size()</code> (source: <a href="http://www.cplusplus.com/reference/stl/set/find/">C++ Reference</a>), the membership test is also in <code>${\cal O}(log(n))$</code>.</p> <h2>Sets of structs</h2> <p>If you want to create a set of structs, you have to create a comperator:</p> <div class="highlight"><pre><code class="cpp"><span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Edge</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">left</span><span class="p">,</span> <span class="k">const</span> <span class="n">Edge</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">left</span><span class="p">.</span><span class="n">uniqueEdge</span> <span class="o">&lt;</span> <span class="n">right</span><span class="p">.</span><span class="n">uniqueEdge</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>See also</h2> <ul> <li>C++ Reference: <a href="http://www.cplusplus.com/reference/stl/set/">general information</a> and <a href="http://www.cplusplus.com/reference/stl/set/set/">example</a></li> <li><a href="http://stackoverflow.com/questions/1701067/how-to-check-that-an-element-is-in-a-stdset">How to check that an element is in a std::set?</a></li> </ul> Stacks in C++ http://martin-thoma.com/stacks-in-cpp Mon, 28 May 2012 09:45:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/stacks-in-cpp <h2>Minimum Example</h2> <div class="highlight"><pre><code class="c++ language-c++" data-lang="c++"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;stack&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span> <span class="n">stack</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">myStack</span><span class="p">;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Size of stack: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// get the element on the top</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Top: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">top</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// it does NOT automatically pop!</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Top: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">top</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="c1">// pop has NO return value!</span> <span class="n">myStack</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Top: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">myStack</span><span class="p">.</span><span class="n">top</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Maximum number of elements</h2> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;stack&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">stack</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">s</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">1000000</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Size of stack: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">s</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">Size of stack: 100000000 </code></pre></div> <p>100,000,000 could be added without any problems.</p> <h2>See also</h2> <ul> <li>C++ Reference: <a href="http://www.cplusplus.com/reference/stl/stack/">general information</a> and <a href="http://www.cplusplus.com/reference/stl/stack/stack/">example</a></li> <li><a href="http://en.wikipedia.org/wiki/Stack_(data_structure)">General information about the datastructure stack</a></li> </ul> C Puzzle #1 http://martin-thoma.com/c-puzzle-1 Mon, 21 May 2012 11:15:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/c-puzzle-1 <p>What is the output of the following programm?</p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span><span class="o">*</span> <span class="nf">f</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="k">return</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="n">i</span><span class="p">;</span> <span class="p">}</span> <span class="kt">void</span> <span class="nf">g</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span><span class="o">*</span> <span class="n">x</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span> <span class="n">g</span><span class="p">();</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;x = %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">x</span><span class="p">);</span> <span class="n">g</span><span class="p">();</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;x = %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">x</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h2>Short Answer</h2> <p>It depends on your compiler flags!</p> <p>If you compile it with no optimization, you might get 43:</p> <div class="highlight"><pre><code class="bash"><span class="sb">`</span><span class="nv">$ </span>gcc -O0 cpuzzle-1.c <span class="p">;</span> ./a.out aufgabe-3.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>f<span class="p">&amp;</span>rsquo<span class="p">;</span>: aufgabe-3.c:5: warning: <span class="k">function </span>returns address of <span class="nb">local </span>variable <span class="nv">x</span> <span class="o">=</span> 43 <span class="nv">x</span> <span class="o">=</span> 43 </code></pre></div> <p>If you compile it with 03 Optimization, you might get 5.</p> <div class="highlight"><pre><code class="bash"><span class="nv">$`</span> gcc -O3 cpuzzle-1.c <span class="p">;</span> ./a.out aufgabe-3.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>f<span class="p">&amp;</span>rsquo<span class="p">;</span>: aufgabe-3.c:5: warning: <span class="k">function </span>returns address of <span class="nb">local </span>variable <span class="nv">x</span> <span class="o">=</span> 5 <span class="nv">x</span> <span class="o">=</span> 5 </code></pre></div> <h2>Long answer</h2> <h3>The general answer</h3> <p>Lets analyse this code line by line.</p> <p>Line 3 - 7 is a function <strong>f</strong> that returns a pointer to an integer. The pointer points to a local variable. As far as I know it is not defined what value should be there after you leave the function (has anybody a source for that?). The variable is a so called local or automatic variable and is located on the stack frame.</p> <p>Line 9 - 14 is a function <strong>g</strong> that doesn&#39;t take any parameter and doesn&#39;t return anything. This function <em>should</em> not have any influence on the behavior of the program. It puts 42 on the stack and increases it by one.</p> <p>Line 17 calls f and stores the returned function pointer in the variable x.</p> <p>Line 18 calls g. Remember that g should not have any influence on the other program. But you saved a pointer to a local variable which is not in the scope of the main function. So g is allowed to use the space which was previously used by the local variable i in the function f. It uses this space for j = 42 and increases it by 1. So if you access the address of the former variable i in f you will get 43.</p> <h3>Actual assembly code</h3> <p>You still want to get more into detail? Ok ... First you should get your assembly code. If you&#39;re running a Linux machine, you can type this into the console:</p> <div class="highlight"><pre><code class="bash">gcc -S -O0 cpuzzle-1.c <span class="p">;</span> gcc cpuzzle-1.c -o cpuzzle<span class="p">;</span> mv cpuzzle-1.s cpuzzle-1-O0.s </code></pre></div> <p>This will create a file called &quot;cpuzzle-1.s&quot; which contains the assembly code for the non-optimized version. Rename it into &quot;cpuzzle-1-O0.c&quot;. Then the same for O3:</p> <div class="highlight"><pre><code class="bash">gcc -S -O3 cpuzzle-1.c <span class="p">;</span> gcc cpuzzle-1.c -o cpuzzle<span class="p">;</span> mv cpuzzle-1.s cpuzzle-1-O3.s </code></pre></div> <p>Now you can compare those two with meld or any other diff Tool: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/05/c-puzzle-1.1-meld-300x188.png"><img src="../images/2012/05/c-puzzle-1.1-meld-300x188.png" alt="" width="300" height="188" class="size-medium wp-image-24851"/></a><p class="wp-caption-text"></p></div> The O3 code got an additional <code>.p2align 4,,15</code></p> <blockquote>.p2align 4,,15 means: When allocating memory, align it such that each new section must start at a location with 4 0's at the end (i.e. a multiple of 16 bytes), except for if more than 15 bytes must be skipped.</blockquote> <p><span class="quote-source">Quoted from <a href="http://answers.yahoo.com/question/index?qid=20100414222831AAxKaHs">MooseBoy</a></span></p> <p>It makes sense to store the data this way, as your computer can only access blocks. If one piece of data is half in one block, half in the other, you have to make to (slow) memory-accesses.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/05/c-puzzle-1.2-meld-300x113.png"><img src="../images/2012/05/c-puzzle-1.2-meld-300x113.png" alt="" width="300" height="113" class="size-medium wp-image-24881"/></a><p class="wp-caption-text"></p></div> <p>It is quite difficult to talk about it, so I made some annotations to this code. I have to admit that I don&#39;t know why the compiler does most of the optimizations :-( <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/05/c-puzzle-1.1-meld-annotated-300x188.png"><img src="../images/2012/05/c-puzzle-1.1-meld-annotated-300x188.png" alt="" width="300" height="188" class="size-medium wp-image-24941"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/05/c-puzzle-1.2-meld-annotated-300x113.png"><img src="../images/2012/05/c-puzzle-1.2-meld-annotated-300x113.png" alt="" width="300" height="113" class="size-medium wp-image-24951"/></a><p class="wp-caption-text"></p></div> <p>You might also be interested in <a href="http://refspecs.linuxbase.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/libc---printf-chk-1.html">_<em>printf</em>chk</a>. An implementation is <a href="http://www.ic.unicamp.br/~islene/2s2008-mo806/libc/debug/printf_chk.c">here</a>.</p> <h2>What you should have learned</h2> <p>Never return pointers to local variables / variables in the wrong scope.</p> <h2>See also</h2> <ul> <li>Wikipedia: <ul> <li><a href="http://en.wikipedia.org/wiki/Stack_frame#Structure">Stack frame</a></li> <li><a href="http://en.wikipedia.org/wiki/Call_stack">Call Stack</a></li> <li><a href="http://en.wikipedia.org/wiki/Scope_(computer_science)">Scope</a></li> </ul> </li> <li><a href="../get-your-programs-assembly-code-and-more-information/" title="Get your programs assembly code and more information">Get your programs assembly code and more information</a></li> <li><a href="http://www.a-m-i.de/tips/stack/stack.php">Der "Stack Frame"</a> (German article about the stack frame)</li> </ul> How do Bitmasks work? http://martin-thoma.com/how-do-bitmasks-work Fri, 18 May 2012 21:02:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-do-bitmasks-work <h2>What are Bitmasks?</h2> <p>In computer science, a <a href="http://en.wikipedia.org/wiki/Mask_(computing)">mask</a> is data that is used for bitwise operations. Essentially it is a variable.</p> <p>They are very often used in C programs.</p> <h2>Bit operators</h2> <p>These are the bit operators:</p> <ul> <li>~ Bitwise NOT (not to be confused with Logical NOT &lsquo;!&rsquo;)</li> <li>& Bitwise AND (not to be confused with Logical AND &lsquo;&&&rsquo;)</li> <li>| Bitwise OR (again, not to be confused with Logical OR &lsquo;||&rsquo;)</li> <li>^ Bitwise XOR</li> <li><< Bitwise left shift</li> <li>>> Bitwise right shift</li> </ul> <p>This is how the operators work: <table style="border:1px solid black;" border="1"> <tr style="background-color:#ccff99"> <th>Bit A</th> <th style="border-right:1px solid #000;">Bit B</th> <th>A &amp; B</th> <th>A | B</th> <th style="border-right:1px solid #000;">A ^ B</th> <th style="border-right:1px solid #000;">~A</th> <th>A &lt;&lt; B</th> <th>A &gt;&gt; B</th> </tr> <tr style="background-color:#ffffcc;"> <td>0</td> <td style="border-right:1px solid #000;">0</td> <td>0</td> <td>0</td> <td style="border-right:1px solid #000;">0</td> <td style="border-right:1px solid #000;">1</td> <td>0</td> <td>0</td> </tr> <tr> <td>0</td> <td style="border-right:1px solid #000;">1</td> <td>0</td> <td>1</td> <td style="border-right:1px solid #000;">1</td> <td style="border-right:1px solid #000;">1</td> <td>0</td> <td>0</td> </tr> <tr style="background-color:#ffffcc;"> <td>1</td> <td style="border-right:1px solid #000;">0</td> <td>0</td> <td>1</td> <td style="border-right:1px solid #000;">1</td> <td style="border-right:1px solid #000;">0</td> <td>1</td> <td>1</td> </tr> <tr> <td>1</td> <td style="border-right:1px solid #000;">1</td> <td>1</td> <td>1</td> <td style="border-right:1px solid #000;">0</td> <td style="border-right:1px solid #000;">0</td> <td>2</td> <td>0</td> </tr> </table></p> <h2>Some examples</h2> <p>Lets say I have any variable named &quot;variable&quot; with 32 bit.</p> <p>Get the last bit:</p> <div class="highlight"><pre><code class="c"><span class="k">return</span> <span class="n">variable</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="mi">1</span><span class="p">;</span> </code></pre></div> <p>Get the first bit:</p> <div class="highlight"><pre><code class="c"><span class="k">return</span> <span class="n">variable</span> <span class="o">&gt;&gt;</span> <span class="mi">31</span><span class="p">;</span> </code></pre></div> <p>Get the bits 4 - 14 (11 bits):</p> <div class="highlight"><pre><code class="c"><span class="k">return</span> <span class="p">(</span><span class="n">variable</span> <span class="o">&gt;&gt;</span> <span class="mi">4</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="p">((</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">11</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span> </code></pre></div> <p>Getting the pow(2,11):</p> <div class="highlight"><pre><code class="c"><span class="k">return</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">11</span><span class="p">;</span> </code></pre></div> <h2>See also</h2> <ul> <li><a href="http://stackoverflow.com/questions/231760/what-does-a-type-followed-by-t-underscore-t-represent/231807#231807">What does a type followed by _t (underscore-t) represent?</a>. Jonathan Leffler, Stackoverflow.</li> <li><a href="http://stackoverflow.com/a/9602958/562769">Why does mode_t use 4 byte?</a>. Niklas B., Stackoverflow.</li> </ul> How to visualize Graph algorithms with LaTeX http://martin-thoma.com/how-to-visualize-graph-algorithms-with-latex Wed, 16 May 2012 11:16:29 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-visualize-graph-algorithms-with-latex <p>Tkiz is a very powerful TeX package. You can easily create visualizations of graphs and graph algorithms (if you have a template ;-) ). This post should give you a template to visualize graph algorithms with LaTeX. I recently found a great animation of Prim&#39;s algorithm done by <a href="http://www.texample.net/tikz/examples/prims-algorithm/">Kjell Magne Fauske</a>. I&#39;ve edited his source files to show an eulerian path. This is how it looks like: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/05/tikz-animation.gif"><img src="../images/2012/05/tikz-animation.gif" alt="" width="512" height="228" class="size-full wp-image-24611"/></a><p class="wp-caption-text"></p></div> This animation was automatically created. See <a href='../images/2012/05/LaTeX-example.zip'>Archive</a> and the intermediate <a href='../images/2012/05/tikz-animation.pdf'>PDF</a>.</p> <h2>The ideas</h2> <h3>Draw the Graph</h3> <p>If you want to visualize a graph algorithm, you should first try to get the image of the graph with Tikz. First include all packages / create the general structure of the document:</p> <div class="highlight"><pre><code class="python">\<span class="n">documentclass</span><span class="p">[</span><span class="n">hyperref</span><span class="o">=</span><span class="p">{</span><span class="n">pdfpagelabels</span><span class="o">=</span><span class="n">false</span><span class="p">}]{</span><span class="n">beamer</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">lmodern</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">utf8</span><span class="p">]{</span><span class="n">inputenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">ngerman</span><span class="p">]{</span><span class="n">babel</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">T1</span><span class="p">]{</span><span class="n">fontenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">correct</span> <span class="n">output</span> <span class="n">of</span> <span class="n">umlauts</span> <span class="ow">in</span> <span class="n">pdf</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">verbatim</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">tikz</span><span class="p">}</span> \<span class="n">usetikzlibrary</span><span class="p">{</span><span class="n">arrows</span><span class="p">,</span><span class="n">shapes</span><span class="p">}</span> <span class="o">%</span> <span class="n">see</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">deic</span><span class="o">.</span><span class="n">uab</span><span class="o">.</span><span class="n">es</span><span class="o">/~</span><span class="n">iblanes</span><span class="o">/</span><span class="n">beamer_gallery</span><span class="o">/</span><span class="n">index_by_theme</span><span class="o">.</span><span class="n">html</span> \<span class="n">usetheme</span><span class="p">{</span><span class="n">Frankfurt</span><span class="p">}</span> \<span class="n">usefonttheme</span><span class="p">{</span><span class="n">professionalfonts</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> <span class="n">Your</span> <span class="n">content</span> <span class="n">will</span> <span class="n">be</span> <span class="n">here</span><span class="o">.</span> \<span class="n">end</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> </code></pre></div> <p>Simple graphs could look like this:</p> <div class="highlight"><pre><code class="python">\<span class="n">begin</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">-&gt;</span><span class="p">,</span><span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">auto</span><span class="p">,</span><span class="n">swap</span><span class="p">]</span> <span class="o">%</span> <span class="n">Draw</span> <span class="n">the</span> <span class="n">vertices</span><span class="o">.</span> \<span class="n">node</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$a (this is text)$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$b$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$c$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$d$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$d$`</span><span class="p">};</span> <span class="o">%</span> <span class="n">Connect</span> <span class="n">vertices</span> <span class="k">with</span> <span class="n">edges</span> <span class="ow">and</span> <span class="n">draw</span> <span class="n">weights</span> \<span class="n">path</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">b</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">c</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">d</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">a</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> </code></pre></div> <p>You should get something similar to this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/05/simple-example-graph-300x105.png"><img src="../images/2012/05/simple-example-graph-300x105.png" alt="" width="300" height="105" class="size-medium wp-image-24691"/></a><p class="wp-caption-text"></p></div></p> <h3>Animate</h3> <p>Animations can be created with Tikz by working with layers. You don&#39;t want to redraw the whole graph every time. Most of the time you want to overlay/underlay some parts of the graph. This can be achieved by declaring a new layer:</p> <div class="highlight"><pre><code class="python">\<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">NAME</span><span class="p">}</span> </code></pre></div> <p>Then you need to tell PGF which layers are to use in the next figure:</p> <div class="highlight"><pre><code class="python">\<span class="n">pgfsetlayers</span><span class="p">{</span><span class="n">LAYER</span> <span class="n">LIST</span><span class="p">}</span> </code></pre></div> <p>The layer main should always be part of the list. Here is an example:</p> <div class="highlight"><pre><code class="python">\<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">background</span><span class="p">}</span> \<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">foreground</span><span class="p">}</span> \<span class="n">pgfsetlayers</span><span class="p">{</span><span class="n">background</span><span class="p">,</span><span class="n">main</span><span class="p">,</span><span class="n">foreground</span><span class="p">}</span> </code></pre></div> <p>Now the magic begins. You consecutively add frames to the layer:</p> <div class="highlight"><pre><code class="python"> \<span class="n">begin</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}{</span><span class="n">background</span><span class="p">}</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">10</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">12</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}</span> </code></pre></div> <p>The number (2, 10 and 12 in this example) indicate the frame in which it should be added. This is the absolute frame, but 1 is the first frame of the figure environment!</p> <h3>Status quo</h3> <div class="highlight"><pre><code class="python">\<span class="n">documentclass</span><span class="p">[</span><span class="n">hyperref</span><span class="o">=</span><span class="p">{</span><span class="n">pdfpagelabels</span><span class="o">=</span><span class="n">false</span><span class="p">}]{</span><span class="n">beamer</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">lmodern</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">utf8</span><span class="p">]{</span><span class="n">inputenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">ngerman</span><span class="p">]{</span><span class="n">babel</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">T1</span><span class="p">]{</span><span class="n">fontenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">correct</span> <span class="n">output</span> <span class="n">of</span> <span class="n">umlauts</span> <span class="ow">in</span> <span class="n">pdf</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">verbatim</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">tikz</span><span class="p">}</span> \<span class="n">usetikzlibrary</span><span class="p">{</span><span class="n">arrows</span><span class="p">,</span><span class="n">shapes</span><span class="p">}</span> <span class="o">%</span> <span class="n">see</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">deic</span><span class="o">.</span><span class="n">uab</span><span class="o">.</span><span class="n">es</span><span class="o">/~</span><span class="n">iblanes</span><span class="o">/</span><span class="n">beamer_gallery</span><span class="o">/</span><span class="n">index_by_theme</span><span class="o">.</span><span class="n">html</span> \<span class="n">usetheme</span><span class="p">{</span><span class="n">Frankfurt</span><span class="p">}</span> \<span class="n">usefonttheme</span><span class="p">{</span><span class="n">professionalfonts</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> \<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">background</span><span class="p">}</span> \<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">foreground</span><span class="p">}</span> \<span class="n">pgfsetlayers</span><span class="p">{</span><span class="n">background</span><span class="p">,</span><span class="n">main</span><span class="p">,</span><span class="n">foreground</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">-&gt;</span><span class="p">,</span><span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">auto</span><span class="p">,</span><span class="n">swap</span><span class="p">]</span> <span class="o">%</span> <span class="n">Draw</span> <span class="n">the</span> <span class="n">vertices</span><span class="o">.</span> \<span class="n">node</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$a (this is text)$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$b$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$c$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$d$`</span><span class="p">};</span> \<span class="n">node</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$d$`</span><span class="p">};</span> <span class="o">%</span> <span class="n">Connect</span> <span class="n">vertices</span> <span class="k">with</span> <span class="n">edges</span> <span class="ow">and</span> <span class="n">draw</span> <span class="n">weights</span> \<span class="n">path</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">b</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">c</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">d</span><span class="p">);</span> \<span class="n">path</span> <span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">a</span><span class="p">);</span> \<span class="n">begin</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}{</span><span class="n">background</span><span class="p">}</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">10</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">path</span><span class="o">&lt;</span><span class="mi">12</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> <span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> </code></pre></div> <h3>Simplify it</h3> <p>You can make some definitions, e.g.:</p> <div class="highlight"><pre><code class="python"><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span> </code></pre></div> <p>can be replaced by</p> <div class="highlight"><pre><code class="python">\<span class="n">tikzstyle</span><span class="p">{</span><span class="n">selected</span> <span class="n">edge</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> </code></pre></div> <p>You can make loops:</p> <div class="highlight"><pre><code class="python"> <span class="o">%</span> <span class="n">Draw</span> <span class="n">the</span> <span class="n">vertices</span><span class="o">.</span> \<span class="n">foreach</span> \<span class="n">pos</span> <span class="o">/</span> \<span class="n">identifier</span> <span class="o">/</span> \<span class="n">name</span> <span class="ow">in</span> <span class="p">{{(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">a</span><span class="o">/</span><span class="n">a</span> <span class="p">(</span><span class="n">this</span> <span class="ow">is</span> <span class="n">text</span><span class="p">)},</span> <span class="p">{(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">b</span><span class="p">},</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">c</span><span class="o">/</span><span class="n">c</span><span class="p">},</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">d</span><span class="o">/</span><span class="n">d</span><span class="p">},</span> <span class="p">{(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">e</span><span class="o">/</span><span class="n">d</span><span class="p">}}</span> \<span class="n">node</span> <span class="p">(</span>\<span class="n">identifier</span><span class="p">)</span> <span class="n">at</span> \<span class="n">pos</span> <span class="p">{</span><span class="sb">`$\name$`</span><span class="p">};</span> </code></pre></div> <h2>The whole, working template</h2> <div class="highlight"><pre><code class="python">\<span class="n">documentclass</span><span class="p">[</span><span class="n">hyperref</span><span class="o">=</span><span class="p">{</span><span class="n">pdfpagelabels</span><span class="o">=</span><span class="n">false</span><span class="p">}]{</span><span class="n">beamer</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">lmodern</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">utf8</span><span class="p">]{</span><span class="n">inputenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">ngerman</span><span class="p">]{</span><span class="n">babel</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">german</span> <span class="n">umlauts</span> \<span class="n">usepackage</span><span class="p">[</span><span class="n">T1</span><span class="p">]{</span><span class="n">fontenc</span><span class="p">}</span> <span class="o">%</span> <span class="n">this</span> <span class="ow">is</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">correct</span> <span class="n">output</span> <span class="n">of</span> <span class="n">umlauts</span> <span class="ow">in</span> <span class="n">pdf</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">verbatim</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">tikz</span><span class="p">}</span> \<span class="n">usetikzlibrary</span><span class="p">{</span><span class="n">arrows</span><span class="p">,</span><span class="n">shapes</span><span class="p">}</span> <span class="o">%</span> <span class="n">Define</span> <span class="n">some</span> <span class="n">styles</span> <span class="k">for</span> <span class="n">graphs</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">vertex</span><span class="p">}</span><span class="o">=</span><span class="p">[</span><span class="n">circle</span><span class="p">,</span><span class="n">fill</span><span class="o">=</span><span class="n">black</span><span class="err">!</span><span class="mi">25</span><span class="p">,</span><span class="n">minimum</span> <span class="n">size</span><span class="o">=</span><span class="mi">20</span><span class="n">pt</span><span class="p">,</span><span class="n">inner</span> <span class="n">sep</span><span class="o">=</span><span class="mi">0</span><span class="n">pt</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">selected</span> <span class="n">vertex</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">vertex</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">red</span><span class="err">!</span><span class="mi">24</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">blue</span> <span class="n">vertex</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">vertex</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">blue</span><span class="err">!</span><span class="mi">24</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">edge</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">thick</span><span class="p">,</span><span class="o">-</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">weight</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">font</span><span class="o">=</span>\<span class="n">small</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">selected</span> <span class="n">edge</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">red</span><span class="err">!</span><span class="mi">50</span><span class="p">]</span> \<span class="n">tikzstyle</span><span class="p">{</span><span class="n">ignored</span> <span class="n">edge</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span><span class="n">draw</span><span class="p">,</span><span class="n">line</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="o">-</span><span class="p">,</span><span class="n">black</span><span class="err">!</span><span class="mi">20</span><span class="p">]</span> <span class="o">%</span> <span class="n">see</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">deic</span><span class="o">.</span><span class="n">uab</span><span class="o">.</span><span class="n">es</span><span class="o">/~</span><span class="n">iblanes</span><span class="o">/</span><span class="n">beamer_gallery</span><span class="o">/</span><span class="n">index_by_theme</span><span class="o">.</span><span class="n">html</span> \<span class="n">usetheme</span><span class="p">{</span><span class="n">Frankfurt</span><span class="p">}</span> \<span class="n">usefonttheme</span><span class="p">{</span><span class="n">professionalfonts</span><span class="p">}</span> <span class="o">%</span> <span class="n">disables</span> <span class="n">bottom</span> <span class="n">navigation</span> <span class="n">bar</span> \<span class="n">beamertemplatenavigationsymbolsempty</span> <span class="o">%</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">tex</span><span class="o">.</span><span class="n">stackexchange</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">questions</span><span class="o">/</span><span class="mi">23727</span><span class="o">/</span><span class="n">converting</span><span class="o">-</span><span class="n">beamer</span><span class="o">-</span><span class="n">slides</span><span class="o">-</span><span class="n">to</span><span class="o">-</span><span class="n">animated</span><span class="o">-</span><span class="n">images</span> \<span class="n">setbeamertemplate</span><span class="p">{</span><span class="n">navigation</span> <span class="n">symbols</span><span class="p">}{}</span><span class="o">%</span> \<span class="n">begin</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> \<span class="n">pgfdeclarelayer</span><span class="p">{</span><span class="n">background</span><span class="p">}</span> \<span class="n">pgfsetlayers</span><span class="p">{</span><span class="n">background</span><span class="p">,</span><span class="n">main</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">-&gt;</span><span class="p">,</span><span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">auto</span><span class="p">,</span><span class="n">swap</span><span class="p">]</span> <span class="o">%</span> <span class="n">Draw</span> <span class="n">the</span> <span class="n">vertices</span><span class="o">.</span> <span class="n">First</span> <span class="n">you</span> <span class="n">define</span> <span class="n">a</span> <span class="nb">list</span><span class="o">.</span> \<span class="n">foreach</span> \<span class="n">pos</span><span class="o">/</span>\<span class="n">name</span> <span class="ow">in</span> <span class="p">{{(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">a</span><span class="p">},</span> <span class="p">{(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="n">b</span><span class="p">},</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="n">c</span><span class="p">},</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">d</span><span class="p">},</span> <span class="p">{(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">e</span><span class="p">},</span> <span class="p">{(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">f</span><span class="p">},</span> <span class="p">{(</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="n">g</span><span class="p">},</span> <span class="p">{(</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="n">h</span><span class="p">},</span> <span class="p">{(</span><span class="mi">4</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">i</span><span class="p">},</span> <span class="p">{(</span><span class="mi">5</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">/</span><span class="n">j</span><span class="p">}}</span> \<span class="n">node</span><span class="p">[</span><span class="n">vertex</span><span class="p">]</span> <span class="p">(</span>\<span class="n">name</span><span class="p">)</span> <span class="n">at</span> \<span class="n">pos</span> <span class="p">{</span><span class="sb">`$\name$`</span><span class="p">};</span> <span class="o">%</span> <span class="n">Connect</span> <span class="n">vertices</span> <span class="k">with</span> <span class="n">edges</span> <span class="ow">and</span> <span class="n">draw</span> <span class="n">weights</span> \<span class="n">foreach</span> \<span class="n">source</span><span class="o">/</span> \<span class="n">dest</span> <span class="o">/</span>\<span class="n">pos</span> <span class="ow">in</span> <span class="p">{</span><span class="n">a</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="p">,</span> <span class="n">b</span><span class="o">/</span><span class="n">c</span><span class="o">/</span><span class="p">,</span> <span class="n">c</span><span class="o">/</span><span class="n">d</span><span class="o">/</span><span class="p">,</span> <span class="n">d</span><span class="o">/</span><span class="n">a</span><span class="o">/</span><span class="p">,</span> <span class="n">c</span><span class="o">/</span><span class="n">e</span><span class="o">/</span><span class="n">bend</span> <span class="n">left</span><span class="p">,</span> <span class="n">d</span><span class="o">/</span><span class="n">e</span><span class="o">/</span><span class="p">,</span> <span class="n">e</span><span class="o">/</span><span class="n">c</span><span class="o">/</span><span class="p">,</span> <span class="n">e</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="p">,</span> <span class="n">f</span><span class="o">/</span><span class="n">g</span><span class="o">/</span><span class="p">,</span> <span class="n">f</span><span class="o">/</span><span class="n">i</span><span class="o">/</span><span class="p">,</span> <span class="n">g</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="n">bend</span> <span class="n">right</span><span class="p">,</span> <span class="n">i</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="n">bend</span> <span class="n">left</span><span class="p">,</span> <span class="n">g</span><span class="o">/</span><span class="n">h</span><span class="o">/</span><span class="p">,</span> <span class="n">h</span><span class="o">/</span><span class="n">j</span><span class="o">/</span><span class="p">,</span> <span class="n">j</span><span class="o">/</span><span class="n">i</span><span class="o">/</span><span class="p">,</span> <span class="n">i</span><span class="o">/</span><span class="n">g</span><span class="o">/</span><span class="p">}</span> \<span class="n">path</span> <span class="p">(</span>\<span class="n">source</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span>\<span class="n">pos</span><span class="p">]</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span>\<span class="n">dest</span><span class="p">);</span> <span class="o">%</span> <span class="n">Start</span> <span class="n">animating</span> <span class="n">the</span> <span class="n">edge</span> <span class="n">selection</span><span class="o">.</span> <span class="o">%</span> <span class="n">For</span> <span class="n">convenience</span> <span class="n">we</span> <span class="n">use</span> <span class="n">a</span> <span class="n">background</span> <span class="n">layer</span> <span class="n">to</span> <span class="o">%</span> <span class="n">highlight</span> <span class="n">edges</span><span class="o">.</span> <span class="n">This</span> <span class="n">way</span> <span class="n">we</span> <span class="n">don</span><span class="s">&#39;t have to worry about </span> <span class="o">%</span> <span class="n">the</span> <span class="n">highlighting</span> <span class="n">covering</span> <span class="n">weight</span> <span class="n">labels</span><span class="o">.</span> \<span class="n">begin</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}{</span><span class="n">background</span><span class="p">}</span> \<span class="n">foreach</span> \<span class="n">source</span> <span class="o">/</span> \<span class="n">dest</span> <span class="o">/</span> \<span class="n">fr</span> <span class="o">/</span> \<span class="n">pos</span> <span class="ow">in</span> <span class="p">{</span><span class="n">d</span><span class="o">/</span><span class="n">a</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="p">,</span> <span class="n">a</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="mi">2</span><span class="o">/</span><span class="p">,</span> <span class="n">b</span><span class="o">/</span><span class="n">c</span><span class="o">/</span><span class="mi">3</span><span class="o">/</span><span class="p">,</span> <span class="n">c</span><span class="o">/</span><span class="n">d</span><span class="o">/</span><span class="mi">4</span><span class="o">/</span><span class="p">,</span> <span class="n">d</span><span class="o">/</span><span class="n">e</span><span class="o">/</span><span class="mi">5</span><span class="o">/</span><span class="p">,</span> <span class="n">e</span><span class="o">/</span><span class="n">c</span><span class="o">/</span><span class="mi">6</span><span class="o">/</span><span class="p">,</span> <span class="n">c</span><span class="o">/</span><span class="n">e</span><span class="o">/</span><span class="mi">7</span><span class="o">/</span><span class="n">bend</span> <span class="n">left</span><span class="p">,</span> <span class="n">e</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="mi">8</span><span class="o">/</span><span class="p">,</span> <span class="n">f</span><span class="o">/</span><span class="n">g</span><span class="o">/</span><span class="mi">9</span><span class="o">/</span><span class="p">,</span> <span class="n">g</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="mi">10</span><span class="o">/</span><span class="n">bend</span> <span class="n">right</span><span class="p">,</span> <span class="n">f</span><span class="o">/</span><span class="n">i</span><span class="o">/</span><span class="mi">11</span><span class="o">/</span><span class="p">,</span> <span class="n">i</span><span class="o">/</span><span class="n">g</span><span class="o">/</span><span class="mi">12</span><span class="o">/</span><span class="p">,</span> <span class="n">g</span><span class="o">/</span><span class="n">h</span><span class="o">/</span><span class="mi">13</span><span class="o">/</span><span class="p">,</span> <span class="n">h</span><span class="o">/</span><span class="n">j</span><span class="o">/</span><span class="mi">14</span><span class="o">/</span><span class="p">,</span> <span class="n">j</span><span class="o">/</span><span class="n">i</span><span class="o">/</span><span class="mi">15</span><span class="o">/</span><span class="p">,</span> <span class="n">i</span><span class="o">/</span><span class="n">f</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="n">bend</span> <span class="n">left</span><span class="p">}</span> \<span class="n">path</span><span class="o">&lt;</span>\<span class="n">fr</span><span class="o">-&gt;</span><span class="p">[</span><span class="n">selected</span> <span class="n">edge</span><span class="p">]</span> <span class="p">(</span>\<span class="n">source</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span>\<span class="n">pos</span><span class="p">]</span> <span class="n">node</span> <span class="p">{}</span> <span class="p">(</span>\<span class="n">dest</span><span class="o">.</span><span class="n">center</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">pgfonlayer</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">figure</span><span class="p">}</span> <span class="n">Lorem</span> <span class="n">ipsum</span> <span class="n">dolor</span> <span class="n">sit</span> <span class="n">amet</span><span class="p">,</span> <span class="n">consetetur</span> <span class="n">sadipscing</span> <span class="n">elitr</span><span class="p">,</span> <span class="n">sed</span> <span class="n">diam</span> <span class="n">nonumy</span> <span class="n">eirmod</span> <span class="n">tempor</span> <span class="n">invidunt</span> <span class="n">ut</span> <span class="n">labore</span> <span class="n">et</span> <span class="n">dolore</span> <span class="n">magna</span> <span class="n">aliquyam</span> <span class="n">erat</span><span class="p">,</span> <span class="n">sed</span> <span class="n">diam</span> <span class="n">voluptua</span><span class="o">.</span> <span class="n">At</span> <span class="n">vero</span> <span class="n">eos</span> <span class="n">et</span> <span class="n">accusam</span> <span class="n">et</span><span class="o">.</span> \<span class="n">end</span><span class="p">{</span><span class="n">frame</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> </code></pre></div> <h2>Resources</h2> <ul> <li><a href="http://paws.wcu.edu/tsfoguel/tikzpgfmanual.pdf">TikZ and pgf: Manual for version 1.18</a></li> <li><a href="http://www.texample.net/tikz/examples/">TeXamples.net</a>: Great page with many Tikz-Examples</li> <li><a href="http://www.tex.ac.uk/CTAN/macros/latex/contrib/beamer/doc/beameruserguide.pdf">The beamer class</a></li> </ul> How to create UML class diagrams http://martin-thoma.com/how-to-create-uml-class-diagrams Sun, 06 May 2012 18:38:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-create-uml-class-diagrams <h2>Dia</h2> <p>Creating UML diagrams with Dia works like a charm! It provides some default tools. You should simply try it. Dia is a free tool.</p> <p>Take a look at these screenshots: <div style="width: 231px" class="wp-caption aligncenter"><a href="../images/2012/05/dia-create-class.png"><img src="../images/2012/05/dia-create-class.png" alt="" width="231" height="611" class="size-full wp-image-24211"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 676px" class="wp-caption aligncenter"><a href="../images/2012/05/dia-class-properties.png"><img src="../images/2012/05/dia-class-properties.png" alt="" width="676" height="589" class="size-full wp-image-24221"/></a><p class="wp-caption-text"></p></div> <div style="width: 454px" class="wp-caption aligncenter"><a href="../images/2012/05/dia-association.png"><img src="../images/2012/05/dia-association.png" alt="" width="454" height="447" class="size-full wp-image-24231"/></a><p class="wp-caption-text"></p></div> <div style="width: 519px" class="wp-caption aligncenter"><a href="../images/2012/05/Dia-ClassDiagram.png"><img src="../images/2012/05/Dia-ClassDiagram.png" alt="" width="519" height="104" class="size-full wp-image-24251"/></a><p class="wp-caption-text"></p></div> <h2>LaTeX</h2> <p>I only know MetaUML for creating class diagrams entirely in LaTeX. Does anybody know something different? </p> <p>Of course, you can include a diagram created with Dia: <ol> <li>Export the diagram as PNG (antialized)</li> <li>Add something like that to your tex-file: \includegraphics[width=180mm]{myDiagramm.png}</li> </ol></p> <h3>MetaUML</h3> <p>A MetaUML class diagram looks like that in code (saved as myMetaDiagram.mp):</p> <div class="highlight"><pre><code class="text">input metauml; beginfig(1); Class.World(&quot;World&quot;) (&quot;-age: int&quot;, &quot;#ressources: List&quot;) (&quot;+sayHello(): void&quot;); Class.NoHuman(&quot;Human&quot;) (&quot;-birthday: Date&quot;, &quot;-nickname: String&quot;, &quot;-secret: String&quot;) (&quot;+code(language: Language): Program&quot;); leftToRight(50)(World, NoHuman); drawObjects(World, NoHuman); link(aggregation)(NoHuman.w -- World.e); item(iAssoc)(&quot;1&quot;)(obj.n = .2[World.e,NoHuman.w]); item(iAssoc)(&quot;has &gt;&quot;)(obj.n = .5[World.e,NoHuman.w]); item(iAssoc)(&quot;0..*&quot;)(obj.n = .8[World.e,NoHuman.w]); endfig; end </code></pre></div> <p>You have to execute mpost before you can compile LaTeX. A working example is in this <a href='../images/2012/05/UML.zip'>UML Archive</a>.</p> <p>It looks like that in your generated PDF file: <div style="width: 676px" class="wp-caption aligncenter"><a href="../images/2012/05/MetaUML-class-diagram.png"><img src="../images/2012/05/MetaUML-class-diagram.png" alt="" width="676" height="161" class="size-full wp-image-24271"/></a><p class="wp-caption-text"></p></div></p> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Class_diagram">Class diagram</a>, <a href="http://en.wikipedia.org/wiki/Dia_(software)">Dia</a></li> <li>Dia: <a href="http://www.wspiegel.de/infogk12/oops/dia_einf.html#py16_2">Dia und UML</a></li> <li><a href="http://ftp.fernuni-hagen.de/ftp-dir/pub/mirrors/www.ctan.org/graphics/metapost/contrib/macros/metauml/doc/metauml_manual_0.2.5.pdf">MetaUML: Tutorial, Reference and Test Suite</a></li> <li>Freies Magazin, Mai 2012: <a href="http://www.freiesmagazin.de/freiesMagazin-2012-05">Astah &ndash; Kurzvorstellung des UML-Programms</a> (German)</li> </ul> Google Code Jam 2012 – Round 1C 2012 http://martin-thoma.com/google-code-jam-2012-round-1c-2012 Sun, 06 May 2012 12:03:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-2012-round-1c-2012 <p>4230 tried the first problem, but only 3189 people are listed in the <a href="http://code.google.com/codejam/contest/1781488/scoreboard?c=1781488">scoreboard</a>.</p> <ul> <li>Problem 1 (<a href="http://code.google.com/codejam/contest/1781488/dashboard#s=p0">Diamond Inheritance</a>): <ul> <li>Small Set: 3077/4230 users (73%)</li> <li>Large Set: 2387/3044 users (78%)</li> </ul> </li> <li>Problem 2 (<a href="http://code.google.com/codejam/contest/1781488/dashboard#s=p1">Out of Gas</a>): <ul> <li>Small Set: 471/766 users (61%)</li> <li>Large Set: 73/253 users (29%)</li> </ul> </li> <li>Problem 3 (<a href="http://code.google.com/codejam/contest/1781488/dashboard#s=p2">Box Factory</a>): <ul> <li>Small Set: 1071/1810 users (59%)</li> <li>Large Set: 308/788 users (39%)</li> </ul> </li> </ul> <h2>Diamond Inheritance</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">psyco</span> <span class="n">psyco</span><span class="o">.</span><span class="n">full</span><span class="p">()</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">def</span> <span class="nf">line2intlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">getAnswer</span><span class="p">(</span><span class="n">classDict</span><span class="p">,</span> <span class="n">N</span><span class="p">):</span> <span class="k">for</span> <span class="n">startPoint</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">N</span><span class="p">):</span> <span class="n">reachable</span> <span class="o">=</span> <span class="p">[</span><span class="n">startPoint</span><span class="p">]</span> <span class="n">justAppended</span> <span class="o">=</span> <span class="p">[</span><span class="n">startPoint</span><span class="p">]</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">justAppended</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">newJustAppended</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">justAppended</span><span class="p">:</span> <span class="k">for</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">classDict</span><span class="p">[</span><span class="n">node</span><span class="p">]:</span> <span class="k">if</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">reachable</span><span class="p">:</span> <span class="k">return</span> <span class="s">&quot;Yes&quot;</span> <span class="k">else</span><span class="p">:</span> <span class="n">newJustAppended</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new</span><span class="p">)</span> <span class="n">reachable</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new</span><span class="p">)</span> <span class="n">justAppended</span> <span class="o">=</span> <span class="n">newJustAppended</span> <span class="k">return</span> <span class="s">&quot;No&quot;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">N</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="n">classDict</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">classNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="n">liste</span> <span class="o">=</span> <span class="n">line2intlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> <span class="n">classDict</span><span class="p">[</span><span class="n">classNr</span><span class="p">]</span> <span class="o">=</span> <span class="n">liste</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">getAnswer</span><span class="p">(</span><span class="n">classDict</span><span class="p">,</span> <span class="n">N</span><span class="p">)))</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Google_Code_Jam">Google Code Jam</a></li> <li><a href="http://www.go-hero.net/jam/12/">Google Code Jam Statistics</a></li> </ul> Google Code Jam 2012 – Round 1B 2012 http://martin-thoma.com/google-code-jam-2012-round-1b-2012 Sat, 05 May 2012 19:20:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-2012-round-1b-2012 <p>5614 tried the first problem, but only 3281 people are listed in the scoreboard. So quite a lot tried to solve a problem, but couldn&#39;t even solve one. I think these problems were much harder than the ones from <a href="../google-code-jam-2012-round-1a-2012/" title="Google Code Jam 2012 &ndash; Round 1A 2012">Round 1A 2012</a>.</p> <ul> <li>Problem 1 (<a href="http://code.google.com/codejam/contest/1836486/dashboard#s=p0">Safety in Numbers</a>): <ul> <li>Small Set: 2695/5614 users (48%)</li> <li>Large Set: 2016/2686 users (75%)</li> </ul> </li> <li>Problem 2 (<a href="http://code.google.com/codejam/contest/1836486/dashboard#s=p1">Tide Goes In, Tide Goes Out</a>): <ul> <li>Small Set: 684/894 users (77%)</li> <li>Large Set: 620/671 users (92%)</li> </ul> </li> <li>Problem 3 (<a href="http://code.google.com/codejam/contest/1836486/dashboard#s=p2">Equal Sums</a>): <ul> <li>Small Set: 2261/2534 users (89%)</li> <li>Large Set: 149/854 users (17%)</li> </ul> </li> </ul> <h2>Safety in Numbers</h2> <p>I tried this approach: X is the sum of all points given by judges. The visitors have an equal amount of points to give. <code>$P_i$</code> is the number of total points of contestant i. <code>$J_i$</code> is the number of points of contestant i by the judges. <code>$V_i$</code> is the percentage of the visitors points contestant i gets.</p> <p>So: <code>$P_i = J_i + V_i * X$</code></p> <p>You don&#39;t know <code>$V_i$</code> and <code>$P_i$</code>. You have to get the minimal value of <code>$V_i$</code> to guarantee that contestant <code>$i$</code> will not to be eliminated. So you have to create some kind of &quot;worst case&quot; for contestant i, if he gets <code>$V_i \cdot X$</code> visitor-points. The worst case is that the minimum of all remaining visitors is as high as possible. So if you think of them as players, they will always try to get a equal number of points.</p> <p>If they can get an equal number of points, you can make these (in)equations: <code>$average = (X - p_i)/(N-1)$</code> <code>$p_i + V_i \cdot X \geq avg + \frac{1-V_i}{N-1} \cdot X$</code> <code>$V_i \cdot X - \frac{1-V_i}{N-1} \cdot X \geq avg - p_i$</code> <code>$V_i X (N-1) - (1-V_i) \cdot X \geq (N-1) \cdot (avg - p_i)$</code> <code>$V_i X (N-1) - X +V_i \cdot X \geq (N-1) \cdot (avg - p_i)$</code> <code>$V_i X (N-1) +V_i \cdot X \geq (N-1) \cdot (avg - p_i) + X$</code> <code>$V_i \geq (N-1) \cdot ((avg - p_i) + X)/(X (N-1) +X)$</code> <code>$V_i \geq (N-1) \cdot ((avg - p_i) + X)/(X ((N-1) +1))$</code> <code>$V_i \geq \frac{N-1}{X \cdot N} \cdot (avg - p_i + X)$</code></p> <p>Unfortunately, its possible that the other players can&#39;t get an equal number of points. So this approach is useless in this case.</p> <p>Here is an approach with an approximation, which also works for the large input set.</p> <div class="highlight"><pre><code class="cpp"><span class="cp">#include &lt;iostream&gt;</span> <span class="cp">#include &lt;cstdio&gt;</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">testcases</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">sum</span><span class="p">;</span> <span class="kt">int</span> <span class="n">s</span><span class="p">[</span><span class="mi">1011</span><span class="p">];</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">testcases</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">caseNr</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">caseNr</span> <span class="o">&lt;=</span> <span class="n">testcases</span><span class="p">;</span> <span class="n">caseNr</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span> <span class="cm">/** the sum of all points of all contestants*/</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="n">sum</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="p">}</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Case #%d:&quot;</span><span class="p">,</span> <span class="n">caseNr</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">contestant</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">contestant</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span> <span class="n">contestant</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// approximate the minimum for each contestant</span> <span class="kt">double</span> <span class="n">low</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">high</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// increase the accuracy 100 times</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">low</span> <span class="o">+</span> <span class="n">high</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span> <span class="kt">double</span> <span class="n">me</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">contestant</span><span class="p">]</span> <span class="o">+</span> <span class="n">mid</span> <span class="o">*</span> <span class="n">sum</span><span class="p">;</span> <span class="kt">double</span> <span class="n">remaining</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">mid</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">N</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">remaining</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">k</span> <span class="o">!=</span> <span class="n">contestant</span> <span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="n">amp</span><span class="p">;</span> <span class="n">s</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">me</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// the contestant k needs at least</span> <span class="c1">// this part of all audience votes</span> <span class="n">remaining</span> <span class="o">-=</span> <span class="p">(</span><span class="n">me</span> <span class="o">-</span> <span class="n">s</span><span class="p">[</span><span class="n">k</span><span class="p">])</span> <span class="o">/</span> <span class="n">sum</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="n">remaining</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">low</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">high</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot; %.6lf&quot;</span><span class="p">,</span> <span class="n">low</span> <span class="o">*</span> <span class="mi">100</span><span class="p">);</span> <span class="p">}</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <h2>Tide Goes In, Tide Goes Out</h2> <p>This one could be solved with Graphs. You calculate one Graph, where every node is one cell. Every cell / node is connected to adjacent cells. Every cell has a value which is the time when you can enter them.</p> <p>After you&#39;ve created the graph, you can make something like that:</p> <div class="highlight"><pre><code class="python"><span class="n">graph</span> <span class="o">=</span> <span class="n">createGraph</span><span class="p">(</span><span class="n">floorHeight</span><span class="p">,</span> <span class="n">ceilingHeight</span><span class="p">)</span> <span class="n">endReached</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">nodesReached</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">while</span> <span class="p">(</span><span class="ow">not</span> <span class="n">endReached</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">getMinimumAdjacentNode</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">nodesReached</span><span class="p">)</span> <span class="n">nodesReached</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> <span class="k">return</span> <span class="n">maxTime</span><span class="p">(</span><span class="n">nodesReached</span><span class="p">)</span> </code></pre></div> <h2>Equal Sums</h2> <p>A trivial solution for the small one is to try every combination. You might want to take a look at Pythonss <a href="http://docs.python.org/library/itertools.html#itertools.combinations">itertools.combinations()</a>.</p> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Google_Code_Jam">Google Code Jam</a></li> <li><a href="http://www.go-hero.net/jam/12/">Google Code Jam Statistics</a></li> </ul> How to print Source Code with LaTeX http://martin-thoma.com/how-to-print-source-code-with-latex Sun, 29 Apr 2012 10:04:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-print-source-code-with-latex <p>I often need to print source code. Some years ago for a German competition called &quot;Bundeswettbewerb Informatik&quot;, now for projects at my university. If you use LaTeX, you can simply include the source code into your document! Here are three examples with listings and minted. I&#39;ve also included example PDF files.</p> <h2>listings</h2> <h3>Minimal example</h3> <div style="width: 590px" class="wp-caption aligncenter"><a href="../images/2012/04/latex-java-source-listings.png"><img src="../images/2012/04/latex-java-source-listings.png" alt="" width="590" height="185" class="size-full wp-image-23851"/></a><p class="wp-caption-text"></p></div> <p>Here is an minimal example how you could print Source Code with LaTeX: <a id="more"></a><a id="more-23541"></a> ```latex \documentclass[a4paper,12pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage[utf8]{inputenc} % this is needed for german umlauts \usepackage[ngerman]{babel} % this is needed for german umlauts % this is needed for correct output of umlauts in pdf \usepackage[T1]{fontenc}<br> \usepackage[margin=2.5cm]{geometry} %layout \usepackage{listings} % needed for the inclusion of source code</p> <p>% this is needed for forms and links within the text \usepackage{hyperref} </p> <p>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE DOCUMENT BEGINS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \lstinputlisting[language=Java]{Othello.java} \end{document} ```</p> <h3>My Template</h3> <p>If you want to customize a little bit more and if you want to get highlighted (colorized) source code, you could use the following template. It looks like this as a <a href='../images/2012/04/LaTeX-Source-Code.pdf'>PDF-file</a>. ```latex \documentclass[a4paper,12pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage[utf8]{inputenc} % this is needed for german umlauts \usepackage[ngerman]{babel} % this is needed for german umlauts \usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf \usepackage[margin=2.5cm]{geometry} %layout \usepackage{listings} % needed for the inclusion of source code</p> <p>% the following is needed for syntax highlighting \usepackage{color}</p> <p>\definecolor{dkgreen}{rgb}{0,0.6,0} \definecolor{gray}{rgb}{0.5,0.5,0.5} \definecolor{mauve}{rgb}{0.58,0,0.82}</p> <p>\lstset{ % language=Java, % the language of the code basicstyle=\footnotesize, % the size of the fonts that are used for the code numbers=left, % where to put the line-numbers numberstyle=\tiny\color{gray}, % the style that is used for the line-numbers stepnumber=1, % the step between two line-numbers. If it&#39;s 1, each line % will be numbered numbersep=5pt, % how far the line-numbers are from the code backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color} showspaces=false, % show spaces adding particular underscores showstringspaces=false, % underline spaces within strings showtabs=false, % show tabs within strings adding particular underscores frame=single, % adds a frame around the code rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here)) tabsize=4, % sets default tabsize to 2 spaces captionpos=b, % sets the caption-position to bottom breaklines=true, % sets automatic line breaking breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace title=\lstname, % show the filename of files included with \lstinputlisting; % also try caption instead of title keywordstyle=\color{blue}, % keyword style commentstyle=\color{dkgreen}, % comment style stringstyle=\color{mauve}, % string literal style escapeinside={\%<em>}{</em>)}, % if you want to add a comment within your code morekeywords={*,...} % if you want to add more keywords to the set }</p> <p>% this is needed for forms and links within the text \usepackage{hyperref} </p> <p>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Variablen % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\authorName}{Martin Thoma} \newcommand{\tags}{\authorName, my, tags} \title{This is the title} \author{\authorName} \date{\today}</p> <p>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PDF Meta information % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \hypersetup{ pdfauthor = {\authorName}, pdfkeywords = {\tags}, pdftitle = {This is the title} } </p> <p>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE DOCUMENT BEGINS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \lstinputlisting[language=Java]{Othello.java} \end{document} ```</p> <h3>Supported Languages</h3> <p>The LaTeX listings package provides quite a lot of language and dialects. Each bold dialect is the default dialect:</p> <p>First the interesting ones: <ul> <li>Assembler (Motorola68k, x86masm)</li> <li>bash</li> <li>C (<strong>ANSI</strong>, Handel, Objective, Sharp)</li> <li>C++ (ANSI, GNU, <strong>ISO</strong>, Visual)</li> <li>Java (empty, AspectJ)</li> <li>Python</li> <li>SQL</li> <li>TeX (AlLaTeX, common, LaTeX, <strong>plain</strong>, primitive)</li> <li>XML</li> </ul></p> <p>And the rest: ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, <strong>R/3 6.10</strong>), ACSL, Ada (<strong>2005</strong>, 83, 95), Algol (60, <strong>68</strong>), Ant, Awk (<strong>gnu</strong>, POSIX), Basic (Visual), Caml (<strong>light</strong>, Objective), CIL, Clean, Cobol (1974, <strong>1985</strong>, ibm), Comal 80, command.com (WinXP), Comsol, csh, Delphi, Eiffel, Elan, erlang, Euphoria, Fortran (77, 90, <strong>95</strong>), GCL, Gnuplot, Haskell, HTML, IDL (empty, CORBA), inform, JVMIS, ksh, Lingo, Lisp (empty, Auto), Logo, make (empty, gnu), Mathematica (1.0, 3.0, <strong>5.2</strong>), Matlab, Mercury, MetaPost, Miranda, Mizar, ML, Modula-2, MuPAD, NASTRAN, Oberon-2, OCL (decorative, OMG), Octave, Oz, Pascal (Borland6, Standard, XSC), Perl, PHP, PL/I, Plasm, PostScript, POV, Prolog, Promela, PSTricks, R, Reduce, Rexx, RSL, Ruby, S (empty, PLUS), SAS, Scilab, sh, SHELXL, Simula (<strong>67</strong>, CII, DEC, IBM), SPARQL, tcl (empty, tk), VBScript, Verilog, VHDL (empty, AMS), VRML (97), XSLT</p> <h2>minted</h2> <p>Minted needs the package pygments: <code>bash sudo apt-get install python-pygments </code></p> <h3>Supported Languages</h3> <p>Minted supports quite a lot of languages. You can get the supported languages with this command: <code>bash moose@pc07:~$ pygmentize -L lexers </code></p> <p>This is my output: ```text Pygments version 1.2.2, (c) 2006-2008 by Georg Brandl.</p> <p>Lexers: ~~~~~~~ * Cucumber, cucumber, Gherkin, gherkin: Gherkin (filenames <em>.feature) * abap: ABAP (filenames *.abap) * antlr: ANTLR [a lot more gets supported, I&#39;ve shortened it] * apacheconf, aconf, apache: ApacheConf (filenames .htaccess, apache.conf, apache2.conf) * applescript: AppleScript (filenames *.applescript) * as, actionscript: ActionScript (filenames *.as) * as3, actionscript3: ActionScript 3 (filenames *.as) * aspx-cs: aspx-cs (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd) * aspx-vb: aspx-vb (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd) * asy: Asymptote (filenames *.asy) * basemake: Makefile * bash, sh: Bash (filenames *.sh, *.ebuild, *.eclass) * bat: Batchfile (filenames *.bat, *.cmd) * bbcode: BBCode * befunge: Befunge (filenames *.befunge) * boo: Boo (filenames *.boo) * brainfuck, bf: Brainfuck (filenames *.bf, *.b) * c-objdump: c-objdump (filenames *.c-objdump) * c: C (filenames *.c, *.h) * cheetah, spitfire: Cheetah (filenames *.tmpl, *.spt) * clojure, clj: Clojure (filenames *.clj) * cmake: CMake (filenames *.cmake) * common-lisp, cl: Common Lisp (filenames *.cl, *.lisp, *.el) * console: Bash Session (filenames *.sh-session) * control: Debian Control file (filenames control) * cpp, c++: C++ (filenames *.cpp, *.hpp, *.c++, *.h++, *.cc, *.hh, *.cxx, *.hxx) * cpp-objdump, c++-objdumb, cxx-objdump: cpp-objdump (filenames *.cpp-objdump, *.c++-objdump, *.cxx-objdump) * csharp, c#: C# (filenames *.cs) * css: CSS (filenames *.css) [a lot more gets supported, I&#39;ve shortened it] * cython, pyx: Cython (filenames *.pyx, *.pxd, *.pxi) * d-objdump: d-objdump (filenames *.d-objdump) * d: D (filenames *.d, *.di) * delphi, pas, pascal, objectpascal: Delphi (filenames *.pas) * diff, udiff: Diff (filenames *.diff, *.patch) * django, jinja: Django/Jinja * dpatch: Darcs Patch (filenames *.dpatch, *.darcspatch) * dylan: Dylan (filenames *.dylan) * erb: ERB * erl: Erlang erl session (filenames *.erl-sh) * erlang: Erlang (filenames *.erl, *.hrl) * evoque: Evoque (filenames *.evoque) * fortran: Fortran (filenames *.f, *.f90) * gas: GAS (filenames *.s, *.S) * genshi, kid, xml+genshi, xml+kid: Genshi (filenames *.kid) * genshitext: Genshi Text * glsl: GLSL (filenames *.vert, *.frag, *.geo) * gnuplot: Gnuplot (filenames *.plot, *.plt) * go: Go (filenames *.go) * groff, nroff, man: Groff (filenames *.[1234567], *.man) * haskell, hs: Haskell (filenames *.hs) * html: HTML (filenames *.html, *.htm, *.xhtml, *.xslt) [a lot more gets supported, I&#39;ve shortened it] * ini, cfg: INI (filenames *.ini, *.cfg, *.properties) * io: Io (filenames *.io) * irc: IRC logs (filenames *.weechatlog) * java: Java (filenames *.java) * js, javascript: JavaScript (filenames *.js) [a lot more gets supported, I&#39;ve shortened it] * jsp: Java Server Page (filenames *.jsp) * lhs, literate-haskell: Literate Haskell (filenames *.lhs) * lighty, lighttpd: Lighttpd configuration file * llvm: LLVM (filenames *.ll) * logtalk: Logtalk (filenames *.lgt) * lua: Lua (filenames *.lua) * make, makefile, mf, bsdmake: Makefile (filenames *.mak, Makefile, makefile, Makefile.</em>, GNUmakefile) * mako: Mako (filenames *.mao) * mako: Mako (filenames *.mao) * matlab, octave: Matlab (filenames *.m) * matlabsession: Matlab session * minid: MiniD (filenames *.md) * modelica: Modelica (filenames *.mo) * moocode: MOOCode (filenames *.moo) * mupad: MuPAD (filenames *.mu) * mxml: MXML (filenames *.mxml) * myghty: Myghty (filenames *.myt, autodelegate) * mysql: MySQL * nasm: NASM (filenames *.asm, *.ASM) * newspeak: Newspeak (filenames *.ns2) * nginx: Nginx configuration file * numpy: NumPy * objdump: objdump (filenames *.objdump) * objective-c, objectivec, obj-c, objc: Objective-C (filenames *.m) * ocaml: OCaml (filenames *.ml, *.mli, *.mll, *.mly) * ooc: Ooc (filenames *.ooc) * perl, pl: Perl (filenames *.pl, *.pm) * php, php3, php4, php5: PHP (filenames *.php, *.php[345]) * pot, po: Gettext Catalog (filenames *.pot, *.po) * pov: POVRay (filenames *.pov, *.inc) * prolog: Prolog (filenames *.prolog, *.pro, *.pl) * py3tb: Python 3.0 Traceback (filenames *.py3tb) * pycon: Python console session * pytb: Python Traceback (filenames *.pytb) * python, py: Python (filenames *.py, *.pyw, *.sc, SConstruct, SConscript) * python3, py3: Python 3 * ragel: Ragel [a lot more gets supported, I&#39;ve shortened it] * raw: Raw token data * rb, ruby: Ruby (filenames *.rb, *.rbw, Rakefile, *.rake, *.gemspec, *.rbx) * rbcon, irb: Ruby irb session * rebol: REBOL (filenames *.r, *.r3) * redcode: Redcode (filenames *.cw) * rhtml, html+erb, html+ruby: RHTML (filenames *.rhtml) * rst, rest, restructuredtext: reStructuredText (filenames *.rst, *.rest) * scala: Scala (filenames *.scala) * scheme, scm: Scheme (filenames *.scm) * smalltalk, squeak: Smalltalk (filenames *.st) * smarty: Smarty (filenames *.tpl) * sourceslist, sources.list: Debian Sourcelist (filenames sources.list) * splus, s, r: S (filenames *.S, *.R) * sql: SQL (filenames *.sql) * sqlite3: sqlite3con (filenames *.sqlite3-console) * squidconf, squid.conf, squid: SquidConf (filenames squid.conf) * tcl: Tcl (filenames *.tcl) * tcsh, csh: Tcsh (filenames *.tcsh, *.csh) * tex, latex: TeX (filenames *.tex, *.aux, *.toc) * text: Text only (filenames *.txt) * trac-wiki, moin: MoinMoin/Trac Wiki markup * vala, vapi: Vala (filenames *.vala, *.vapi) * vb.net, vbnet: VB.net (filenames *.vb, *.bas) * vim: VimL (filenames *.vim, .vimrc) <a href="a%20lot%20of%20XML">...</a> [...] * xml: XML (filenames *.xml, *.xsl, *.rss, *.xslt, *.xsd, *.wsdl) * xslt: XSLT (filenames *.xsl, *.xslt) * yaml: YAML (filenames *.yaml, *.yml) ``` <h3>Example</h3> <div style="width: 613px" class="wp-caption aligncenter"><a href="../images/2012/04/latex-java-source-minted.png"><img src="../images/2012/04/latex-java-source-minted.png" alt="" width="613" height="232" class="size-full wp-image-23841"/></a><p class="wp-caption-text"></p></div> This is the <a href='../images/2012/04/minted-source-code.pdf'>PDF-file</a> produced by the following LaTeX-Code:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper,12pt]</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>amssymb<span class="nb">}</span> <span class="c">% needed for math</span> <span class="k">\usepackage</span><span class="nb">{</span>amsmath<span class="nb">}</span> <span class="c">% needed for math</span> <span class="k">\usepackage</span><span class="na">[utf8]</span><span class="nb">{</span>inputenc<span class="nb">}</span> <span class="c">% this is needed for german umlauts</span> <span class="k">\usepackage</span><span class="na">[ngerman]</span><span class="nb">{</span>babel<span class="nb">}</span> <span class="c">% this is needed for german umlauts</span> <span class="k">\usepackage</span><span class="na">[T1]</span><span class="nb">{</span>fontenc<span class="nb">}</span> <span class="c">% this is needed for correct output of umlauts in pdf</span> <span class="k">\usepackage</span><span class="na">[margin=2cm]</span><span class="nb">{</span>geometry<span class="nb">}</span> <span class="c">%layout</span> <span class="k">\usepackage</span><span class="nb">{</span>minted<span class="nb">}</span> <span class="c">% needed for the inclusion of source code</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\renewcommand</span><span class="nb">{</span><span class="k">\theFancyVerbLine</span><span class="nb">}{</span> <span class="k">\sffamily\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.5,0.5,0.5<span class="nb">}{</span><span class="k">\scriptsize\arabic</span><span class="nb">{</span>FancyVerbLine<span class="nb">}}}</span> <span class="k">\inputminted</span><span class="na">[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Othello.java]</span><span class="nb">{</span>java<span class="nb">}{</span>Othello.java<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>Material</h2> <p>All files can be found in <a href='../images/2012/04/LaTeX-Source-Code.zip'>LaTeX-Source-Code Archive</a>.</p> <h2>See also</h2> <ul> <li>WikiBook: <a href="http://en.wikibooks.org/wiki/LaTeX/Packages/Listings">LaTeX/Packages/Listings</a></li> <li><a href="ftp://ftp.fu-berlin.de/tex/CTAN/macros/latex/contrib/listings/listings.pdf">CTAN lisings documentation</a></li> <li><a href="http://ftp.fernuni-hagen.de/ftp-dir/pub/mirrors/www.ctan.org/macros/latex/contrib/minted/minted.pdf">CTAN minted documentation</a></li> </ul> <p>You might also want to try <code>bash texdoc listings </code></p> <p>This command will show a manual as a PDF.</p> Google Code Jam 2012 – Round 1A 2012 http://martin-thoma.com/google-code-jam-2012-round-1a-2012 Sat, 28 Apr 2012 04:11:22 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-2012-round-1a-2012 <p>3691 people are listed in the scoreboard, but 3851 tried the first problem. So I guess the number of contestants might even be higher.</p> <ul> <li>Problem 1 (<a href="http://code.google.com/codejam/contest/1645485/dashboard#s=p0">Password Problem</a>): <ul> <li>Small Set: 3511/3851 users (91%)</li> <li>Large Set: 2329/3376 users (69%)</li> </ul> </li> <li>Problem 2 (<a href="http://code.google.com/codejam/contest/1645485/dashboard#s=p1">Kingdom Rush</a>): <ul> <li>Small Set: 1912/3466 users (55%)</li> <li>Large Set: 1617/1848 users (88%)</li> </ul> </li> <li>Problem 3 (<a href="http://code.google.com/codejam/contest/1645485/dashboard#s=p2">Cruise Control</a>): <ul> <li>Small Set: 65/312 users (21%)</li> <li>Large Set: 22/42 users (52%)</li> </ul> </li> </ul> <p>Just as last time, you can execute these scripts by</p> <div class="highlight"><pre><code class="bash">python jam.py &lt; A-small-practice.in &gt; results.txt </code></pre></div> <p><a id="more"></a><a id="more-23361"></a></p> <h2>Passwords</h2> <p>This works only for the small input set:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">line2floatlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Convert integers in one line, separated by space to a</span> <span class="sd"> list of integers.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">prob</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">probabilities</span><span class="p">):</span> <span class="n">typesMin</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">&#39;inf&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">A</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span> <span class="n">probKorrect</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">probabilities</span><span class="p">[</span><span class="mi">0</span><span class="p">:(</span><span class="nb">len</span><span class="p">(</span><span class="n">probabilities</span><span class="p">)</span><span class="o">-</span><span class="n">i</span><span class="p">)]:</span> <span class="n">probKorrect</span> <span class="o">*=</span> <span class="n">el</span> <span class="n">probWrong</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">probKorrect</span> <span class="n">remainingTypes</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="p">(</span><span class="n">B</span> <span class="o">-</span> <span class="n">A</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">remainingTypesErr</span> <span class="o">=</span> <span class="n">remainingTypes</span> <span class="o">+</span> <span class="n">B</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">types</span> <span class="o">=</span> <span class="n">probKorrect</span> <span class="o">*</span> <span class="n">remainingTypes</span> \ <span class="o">+</span> <span class="n">probWrong</span> <span class="o">*</span> <span class="n">remainingTypesErr</span> <span class="c">#print types</span> <span class="k">if</span> <span class="n">types</span> <span class="o">&lt;</span> <span class="n">typesMin</span><span class="p">:</span> <span class="n">typesMin</span> <span class="o">=</span> <span class="n">types</span> <span class="k">if</span> <span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="n">B</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">typesMin</span><span class="p">:</span> <span class="n">typesMin</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="n">B</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="n">typesMin</span> <span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="c">#return typesMin</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span> <span class="n">A</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">B</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">probabilities</span> <span class="o">=</span> <span class="n">line2floatlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> <span class="c">#print ((A+1), B)</span> <span class="c">#print probabilities</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%.6lf</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">prob</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">probabilities</span><span class="p">)))</span> </code></pre></div> <h2>Kingdom Rush</h2> <p>My solution works only for the small input set:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">deepcopy</span> <span class="k">def</span> <span class="nf">line2intlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Convert integers in one line, separated by space to a</span> <span class="sd"> list of integers.</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">isSolvable</span><span class="p">(</span><span class="n">starDict</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Is it possible to solve this one? &quot;&quot;&quot;</span> <span class="n">intList</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">starDict</span><span class="p">:</span> <span class="n">wasInFor</span> <span class="o">=</span> <span class="bp">True</span> <span class="n">one</span><span class="p">,</span> <span class="n">two</span> <span class="o">=</span> <span class="n">starDict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="n">intList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">one</span><span class="p">)</span> <span class="n">intList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">two</span><span class="p">)</span> <span class="n">intList</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="k">for</span> <span class="n">levelVar</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">intList</span><span class="p">)):</span> <span class="k">if</span> <span class="n">levelVar</span> <span class="o">&lt;</span> <span class="n">intList</span><span class="p">[</span><span class="n">levelVar</span><span class="p">]:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">def</span> <span class="nf">king</span><span class="p">(</span><span class="n">starDict</span><span class="p">,</span> <span class="n">myLevel</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">myCompetes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">partially</span> <span class="o">=</span> <span class="p">[]):</span> <span class="n">somethingChanged</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">while</span> <span class="n">somethingChanged</span><span class="p">:</span> <span class="n">removeList</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">somethingChanged</span> <span class="o">=</span> <span class="bp">False</span> <span class="c">#all where i can do both</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">starDict</span><span class="p">:</span> <span class="n">one</span><span class="p">,</span> <span class="n">two</span> <span class="o">=</span> <span class="n">starDict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="k">if</span> <span class="n">two</span> <span class="o">&lt;=</span> <span class="n">myLevel</span><span class="p">:</span> <span class="n">removeList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">index</span><span class="p">)</span> <span class="n">somethingChanged</span> <span class="o">=</span> <span class="bp">True</span> <span class="c">#remove them</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">removeList</span><span class="p">:</span> <span class="n">myCompetes</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">del</span> <span class="n">starDict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="k">if</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">partially</span><span class="p">:</span> <span class="n">myLevel</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">partially</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">index</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">myLevel</span> <span class="o">+=</span> <span class="mi">2</span> <span class="k">if</span> <span class="n">starDict</span><span class="p">:</span> <span class="n">minCompetes</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">&#39;inf&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">starDict</span><span class="p">:</span> <span class="n">one</span><span class="p">,</span> <span class="n">two</span> <span class="o">=</span> <span class="n">starDict</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="k">if</span> <span class="n">one</span> <span class="o">&lt;=</span> <span class="n">myLevel</span> <span class="ow">and</span> <span class="p">(</span><span class="n">index</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">partially</span><span class="p">):</span> <span class="n">starDictTmp</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">starDict</span><span class="p">)</span> <span class="n">partiallyTmp</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">partially</span><span class="p">)</span> <span class="n">partiallyTmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">index</span><span class="p">)</span> <span class="n">tmpCompetes</span> <span class="o">=</span> <span class="n">king</span><span class="p">(</span><span class="n">starDictTmp</span><span class="p">,</span> <span class="n">myLevel</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">myCompetes</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">partiallyTmp</span><span class="p">)</span> <span class="k">if</span> <span class="n">tmpCompetes</span> <span class="o">&lt;</span> <span class="n">minCompetes</span><span class="p">:</span> <span class="n">minCompetes</span> <span class="o">=</span> <span class="n">tmpCompetes</span> <span class="n">myCompetes</span> <span class="o">=</span> <span class="n">minCompetes</span> <span class="k">return</span> <span class="n">myCompetes</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">levels</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="n">stars</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">levels</span><span class="p">):</span> <span class="n">stars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line2intlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">()))</span> <span class="c">#make stars dictionary</span> <span class="n">starDict</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">level</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">stars</span><span class="p">:</span> <span class="n">starDict</span><span class="p">[</span><span class="n">level</span><span class="p">]</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="n">level</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isSolvable</span><span class="p">(</span><span class="n">starDict</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: Too Bad&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">king</span><span class="p">(</span><span class="n">starDict</span><span class="p">)))</span> </code></pre></div> <h2>Cruise Controll</h2> <p>Only 22 people have a perfect solution for this one. </p> <p>This is the solution of royf:</p> <div class="highlight"><pre><code class="python"><span class="kn">import</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="nn">math</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">def</span> <span class="nf">read_word</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">f</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">def</span> <span class="nf">read_int</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">read_word</span><span class="p">(</span><span class="n">f</span><span class="p">),</span> <span class="n">b</span><span class="p">)</span> <span class="k">def</span> <span class="nf">read_letters</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">read_word</span><span class="p">(</span><span class="n">f</span><span class="p">))</span> <span class="k">def</span> <span class="nf">read_digits</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">read_letters</span><span class="p">(</span><span class="n">f</span><span class="p">)]</span> <span class="k">def</span> <span class="nf">read_words</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">):</span> <span class="k">return</span> <span class="n">read_word</span><span class="p">(</span><span class="n">f</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">def</span> <span class="nf">read_ints</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">read_words</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">d</span><span class="p">)]</span> <span class="k">def</span> <span class="nf">read_arr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">reader</span><span class="o">=</span><span class="n">read_ints</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">R</span><span class="p">):</span> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span> <span class="k">return</span> <span class="n">res</span> <span class="k">def</span> <span class="nf">solve</span><span class="p">(</span><span class="n">solver</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">out_fn</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="n">in_fn</span> <span class="o">=</span> <span class="n">fn</span> <span class="o">+</span> <span class="s">&#39;.in&#39;</span> <span class="k">if</span> <span class="n">out_fn</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">out_fn</span> <span class="o">=</span> <span class="n">fn</span> <span class="o">+</span> <span class="s">&#39;.out&#39;</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">in_fn</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fi</span><span class="p">:</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">out_fn</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fo</span><span class="p">:</span> <span class="n">T</span> <span class="o">=</span> <span class="n">read_int</span><span class="p">(</span><span class="n">fi</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">T</span><span class="p">):</span> <span class="n">case</span> <span class="o">=</span> <span class="n">read_case</span><span class="p">(</span><span class="n">fi</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">solver</span><span class="p">(</span><span class="n">case</span><span class="p">)</span> <span class="n">write_case</span><span class="p">(</span><span class="n">fo</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span> <span class="c">################################################################################</span> <span class="k">def</span> <span class="nf">read_case</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="n">N</span> <span class="o">=</span> <span class="n">read_int</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="n">Cs</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="p">(</span><span class="n">C</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">P</span><span class="p">)</span> <span class="o">=</span> <span class="n">read_words</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="n">Cs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">C</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">S</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">P</span><span class="p">)))</span> <span class="k">return</span> <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">Cs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_case</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">res</span><span class="p">):</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Case #</span><span class="si">%d</span><span class="s">: &#39;</span><span class="o">%</span><span class="n">i</span><span class="p">)</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">&#39;</span><span class="o">%</span><span class="n">res</span><span class="p">)</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="c">################################################################################</span> <span class="n">INF</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s">&#39;inf&#39;</span><span class="p">)</span> <span class="kn">import</span> <span class="nn">heapq</span> <span class="k">def</span> <span class="nf">solve_small</span><span class="p">(</span><span class="n">case</span><span class="p">):</span> <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">Cs</span><span class="p">)</span> <span class="o">=</span> <span class="n">case</span> <span class="n">col</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">s1</span><span class="p">,</span> <span class="n">p1</span><span class="p">)</span> <span class="o">=</span> <span class="n">Cs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">N</span><span class="p">):</span> <span class="p">(</span><span class="n">c2</span><span class="p">,</span> <span class="n">s2</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span> <span class="o">=</span> <span class="n">Cs</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">if</span> <span class="n">s1</span> <span class="o">==</span> <span class="n">s2</span><span class="p">:</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">p1</span><span class="o">-</span><span class="n">p2</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">:</span> <span class="n">heapq</span><span class="o">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span> <span class="k">continue</span> <span class="n">t1</span> <span class="o">=</span> <span class="p">(</span><span class="n">p2</span><span class="o">-</span><span class="n">p1</span><span class="o">+</span><span class="mi">5</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">s1</span><span class="o">-</span><span class="n">s2</span><span class="p">)</span> <span class="n">t2</span> <span class="o">=</span> <span class="p">(</span><span class="n">p2</span><span class="o">-</span><span class="n">p1</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">s1</span><span class="o">-</span><span class="n">s2</span><span class="p">)</span> <span class="k">if</span> <span class="n">t1</span> <span class="o">&gt;</span> <span class="n">t2</span><span class="p">:</span> <span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="n">t2</span><span class="p">,</span> <span class="n">t1</span><span class="p">)</span> <span class="k">if</span> <span class="n">t2</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span> <span class="k">if</span> <span class="n">t1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">t1</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">heapq</span><span class="o">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span> <span class="n">heapq</span><span class="o">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="p">(</span><span class="n">t2</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span> <span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="n">N</span> <span class="n">act</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="n">act</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">set</span><span class="p">())</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">col</span><span class="p">:</span> <span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="o">=</span> <span class="n">heapq</span><span class="o">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">col</span><span class="p">)</span> <span class="k">if</span> <span class="n">c</span><span class="p">:</span> <span class="n">act</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="n">act</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">act</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="n">act</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">Cs</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;L&#39;</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">Cs</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;L&#39;</span> <span class="k">continue</span> <span class="k">if</span> <span class="n">c</span><span class="p">:</span> <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">cnt</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">cnt</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span> <span class="n">cnt</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">else</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="ow">not</span> <span class="n">b</span><span class="p">)</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span> <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span> <span class="k">return</span> <span class="n">t</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span> <span class="k">pass</span> <span class="k">else</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">k</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> <span class="o">!=</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span> <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span> <span class="k">pass</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span> <span class="k">return</span> <span class="n">t</span> <span class="k">else</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">k</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> <span class="o">==</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="ow">not</span> <span class="n">b</span><span class="p">)</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">k</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> <span class="o">!=</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">elif</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">k</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> <span class="o">==</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="p">(</span><span class="n">k_</span><span class="p">,</span> <span class="n">b_</span><span class="p">)</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="n">k_</span><span class="p">:</span> <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="n">b_</span><span class="p">:</span> <span class="k">return</span> <span class="n">t</span> <span class="k">else</span><span class="p">:</span> <span class="k">continue</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">k</span><span class="p">:</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">k_</span><span class="p">,</span> <span class="ow">not</span> <span class="n">b</span> <span class="o">^</span> <span class="n">b_</span> <span class="o">^</span> <span class="n">l</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="k">else</span><span class="p">:</span> <span class="c">#end col</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">act</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">act</span><span class="p">[</span><span class="n">j</span><span class="p">]:</span> <span class="n">l</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span> <span class="k">return</span> <span class="s">&#39;Possible&#39;</span> <span class="n">solve_large</span> <span class="o">=</span> <span class="n">solve_small</span> <span class="c">##def solve_large(case):</span> <span class="n">DEBUG</span> <span class="o">=</span> <span class="s">&#39;i&#39;</span> <span class="kn">from</span> <span class="nn">run</span> <span class="kn">import</span> <span class="o">*</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Google_Code_Jam">Google Code Jam</a></li> <li><a href="http://www.go-hero.net/jam/12/">Google Code Jam Statistics</a></li> </ul> LaTeX-Vorlage für ein Lastenheft http://martin-thoma.com/latex-vorlage-fur-ein-lastenheft Thu, 26 Apr 2012 11:51:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/latex-vorlage-fur-ein-lastenheft <p>Ich habe gerade mal schnell eine Vorlage f&uuml;r ein Lastenheft mit LaTeX erstellt. Dieses Lastenheft beinhaltet sogar ein kleines Use-Case Beispiel, das mit MetaUML realisiert wurde. Hier ist die <a href='../images/2012/04/Lastenheft.pdf'>PDF</a>, hier der <a href='../images/2012/04/Lastenheft.zip'>LaTeX-Code</a>. </p> <p>Das Lastenheft k&ouml;nnt ihr unter Linux einfach mit folgendem Befehl erstellen, wenn ihr in diesem Ordner seid:</p> <div class="highlight"><pre><code class="bash">make </code></pre></div> <p>&Auml;nderungsvorschl&auml;ge sind willkommen! Ich werde die hier gespeicherte Version wohl noch einige male updaten.</p> <h2>Siehe auch</h2> <ul> <li><a href="http://www.st.cs.uni-saarland.de/edu/se1/skript/notes.pdf">Softwaretechnik I</a>, S. 36</li> <li><a href="http://www2.cs.uni-paderborn.de/cs/ag-schaefer/Lehre/Lehrveranstaltungen/Praktika/Softwaretechnikpraktikum/SS06/Dokumentvorlagen/Lastenheft-Template.pdf">Beispiel der Uni Paderborn</a></li> <li><a href="http://next-internet.com/hauptstudium/texte/swt_summary.pdf">Jet Another SWT-I Resume</a>, ab S. 8</li> </ul> Eclipse für SWT I einrichten http://martin-thoma.com/eclipse-fur-swt-i-einrichten Wed, 25 Apr 2012 20:25:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/eclipse-fur-swt-i-einrichten <div class="info">SWT I ist das Modul Softwaretechnik I am <a href="http://de.wikipedia.org/wiki/Karlsruher_Institut_f%C3%BCr_Technologie">KIT</a>. Dieser Blogpost richtet sich also vor allem an Studenten des KIT von Herrn <a href="http://www.ipd.uka.de/Tichy/people.php?id=15">Prof. Dr. Tichy</a>. Ich arbeite au&szlig;erdem mit Ubuntu Linux. Die momentan aktuellste Version nennt sich Oneiric Ocelot und kann bei <a href="http://wiki.ubuntuusers.de/Downloads/Oneiric_Ocelot">UbuntuUsers</a> heruntergeladen werden. Das System k&ouml;nnte z.B. in <a href="http://wiki.ubuntuusers.de/VirtualBox">VirtualBox</a> installiert werden.</div> <p><a id="more"></a><a id="more-22911"></a></p> <h2>Installation</h2> <p>F&uuml;r die Installation von Java, Subversion (SVN), Eclipse und Checkstyle samt Dokumentation muss folgendes in der Konsole eingegeben werden:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install openjdk-6-jre openjdk-6-jdk openjdk-6-source openjdk-6-demo openjdk-6-doc openjdk-6-jre-headless openjdk-6-jre-lib subversion libapache2-svn eclipse checkstyle checkstyle-doc </code></pre></div> <p>Dann werden etwa 276 MB an Archiven heruntergeladen und 662 MB an zus&auml;tzlichen Packeten installiert. Bei meiner Internetverbindung (DSL 1000 :-( ) hat das ca 40 Minuten gedauert.</p> <h2>CheckStyle</h2> <p>Siehe eclipse-cs.sourceforge.net mit <a href="http://eclipse-cs.sourceforge.net/downloads.html">detaillierten Installationsanweisungen</a>. </p> <h2>Subversive</h2> <p>Siehe eclipse.org: <a href="http://www.eclipse.org/subversive/downloads.php#indigo_stable">Download Suversive</a>. Diese Erkl&auml;rung ist aber nicht so toll.</p> <p>Nach der Installation und dem Neustart von Eclipse muss man das &quot;Subversive Connector Kit&quot; ausw&auml;hlen. Kurz in der Konsole <div class="highlight"><pre><code class="bash">svn --version </code></pre></div> eingeben. Bei mir ist anscheinend Subversion in der Version 1.6.12 installiert. Also w&auml;hle ich &quot;SVN Kit 1.3.7&quot;.</p> <p>Zuerst muss man den SVN Connector installieren:</p> <div class="highlight"><pre><code class="text">http://community.polarion.com/projects/subversive/download/eclipse/2.0/update-site/ </code></pre></div> <p>Das macht man wie mit CheckStyle.</p> <p>Dann muss man Subversive installieren:</p> <div class="highlight"><pre><code class="text">http://download.eclipse.org/technology/subversive/0.7/update-site/ </code></pre></div> <p>Auch hier macht man es wie mit CheckStyle.</p> <p>Sobald alles klappt, sieht es etwa so aus: <div style="width: 666px" class="wp-caption aligncenter"><a href="../images/2012/04/eclipse-subversive.png"><img src="../images/2012/04/eclipse-subversive.png" alt="" width="666" height="434" class="size-full wp-image-23271"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/subversive-300x290.png"><img src="../images/2012/04/subversive-300x290.png" alt="" width="300" height="290" class="size-medium wp-image-23751"/></a><p class="wp-caption-text"></p></div> <h2>Grundeinstellungen</h2> <p>Als erstes sollte man mal auf &quot;Window&quot; -&gt; &quot;Open Perspective&quot; -&gt; &quot;Java&quot; klicken.</p> <h2>Siehe auch</h2> <ul> <li><a href="http://wiki.ubuntuusers.de/Downloads">Ubuntu Downloads</a></li> <li><a href="http://wiki.ubuntuusers.de/Java/Installation/Oracle_Java">Oracle Java - Manuelle Installation unter Ubuntu</a>.</li> <li>Weitere UbuntuUsers Artikel: <a href="http://wiki.ubuntuusers.de/Eclipse">Eclipse</a>, <a href="http://wiki.ubuntuusers.de/Subversion">Subversion</a></li> <li><a href="../software-versioning-cheat-sheet/" title="Software Versioning Cheat Sheet">Software Versioning Cheat Sheet (Subversion / GIT)</a></li> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Eclipse_(IDE)">Eclipse</a>, <a href="http://de.wikipedia.org/wiki/Apache_Subversion">Subversion</a></li> <li>Wiki Books: <a href="http://de.wikibooks.org/wiki/Java_Standard:_Erste_Schritte">Java Standard: Erste Schritte</a> (habe ich NICHT gelesen! Aber f&uuml;r unsere Physiker ist das eventuell hilfreich.)</li> </ul> Wie berechnet man das charakteristische Polynom? http://martin-thoma.com/wie-berechnet-man-das-charakteristische-polynom Sat, 21 Apr 2012 11:41:39 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-berechnet-man-das-charakteristische-polynom <p>Will man das charakteristische Polynom einer Abbildungsmatrix berechnen, so muss man zuerst sicher im Umgang mit Determinanten sein.</p> <h2>Rechenregeln f&uuml;r Determinanten</h2> <p>Man darf eine <strong>Zeile mit einer Konstanten a multiplizieren</strong>, muss dann aber die Determinante durch a teilen: <a id="more"></a><a id="more-22721"></a> <code>$ det \begin{pmatrix} 3 &amp; 2 &amp; 12 &amp; 5 \\ 2 &amp; 1 &amp; 6 &amp; 4 \\ 2 &amp; 0 &amp; 2 &amp; -3\\ 2 &amp; 2 &amp; 7 &amp; 4 \end{pmatrix} \begin{array}{c} | \cdot 2 \\ | \cdot 3 \\ | \cdot 3 \\ | \cdot 3 \end{array} = \frac{1}{2} \cdot (\frac{1}{3})^3 \cdot det \begin{pmatrix} 6 &amp; 4 &amp; 24 &amp; 10 \\ 6 &amp; 3 &amp; 18 &amp; 12 \\ 6 &amp; 0 &amp; 6 &amp; -9\\ 6 &amp; 6 &amp; 21 &amp; 12 \end{pmatrix} $</code></p> <p>Man darf zwei <strong>Zeilen / Spalten tauschen</strong>, muss dann aber die Determinante mit (-1) multiplizieren: <code>$det \begin{pmatrix} 6 &amp; 4 &amp; 24 &amp; 10 \\ 6 &amp; 3 &amp; 18 &amp; 12 \\ 6 &amp; 0 &amp; 6 &amp; -9\\ 6 &amp; 6 &amp; 21 &amp; 12 \end{pmatrix} \begin{array}{c} \cdot \\ \cdot \\ \leftarrow \\ \leftarrow \end{array} = - det \begin{pmatrix} 6 &amp; 4 &amp; 24 &amp; 10 \\ 6 &amp; 3 &amp; 18 &amp; 12 \\ 6 &amp; 6 &amp; 21 &amp; 12 \\ 6 &amp; 0 &amp; 6 &amp; -9 \end{pmatrix} = det \begin{pmatrix} 6 &amp; 24 &amp; 4 &amp; 10 \\ 6 &amp; 18 &amp; 3 &amp; 12 \\ 6 &amp; 21 &amp; 6 &amp; 12 \\ 6 &amp; 6 &amp; 0 &amp; -9 \end{pmatrix}$</code></p> <p>Man darf eine <strong>Zeile mit einer Konstanten multiplizieren und auf eine beliebige <em>andere</em> Zeile addieren</strong> (wie beim Gauss-Verfahren)</p> <p>Man darf eine <strong>Zeile und eine Spalte zugleich entfernen</strong> (Entwicklung nach Spalte / Zeile xy), muss dann aber folgenderma&szlig;en ausgleichen: Entwicklung nach der k-ten Spalte: <code>$D(a_1, ... , a_n) = \sum_{j=1}^{n}(-1)^{k+j}a_{jk}D_{jk}$</code> Entwicklung nach der i-ten Zeile: <code>$det A = \sum_{k=1}^n (-1)^{i+k}a_{ik}D_{ik}$</code> Direkt entfernen, ohne etwas weiteres zu beachten, kann man die Zeile, wenn in dieser Zeile nur eine 1 steht und diese 1 an einer ungeraden Spalte (1, ..., n) ist. Eine Spalte kann man direkt entfernen, wenn in der Spalte nur an einer Stelle eine 1 steht und diese 1 an einer ungeraden Zeile (1, ..., n) steht.</p> <h2>Berechnung des charakteristischen Polynoms</h2> <p>Das charakteristische Polynom einer Abbildungsmatrix A ist der Wert folgender Determinanten: <code>$det(\lambda \cdot E_n - A)$</code>, wobei <code>$E_n$</code> die Einheitsmatrix ist.</p> <h2>Beispiel</h2> <p>Siehe <a href="http://de.wikipedia.org/wiki/Charakteristisches_Polynom#Beispiel">Wikipedia</a>.</p> <h2>Berechnung am PC</h2> <p>Mit Wolfram|Alpha kann man das <a href="http://www.wolframalpha.com/widgets/view.jsp?id=27ddb8d522a2dc74e89687bd357db5a0">charakteristische Polynom</a> berechnen und auch direkt die <a href="http://www.wolframalpha.com/input/?i=Eigenvalues%7B%7B1%2C0%2C1%7D%2C%7B2%2C2%2C1%7D%2C%7B4%2C2%2C1%7D%7D">Eigenwerte</a>.</p> <h2>Wozu das Ganze?</h2> <p>An dem charakteristischem Polynom kann man direkt die Eigenwerte ablesen. Existiert eine Basis aus Eigenvektoren f&uuml;r den Vektorraum, dann ist eine Matrix diagonalsiierbar. Wenn eine Matrix in Diagonalform ist, dann kann man damit besonders gut rechnen.</p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Determinante">Determinante</a>, <a href="http://de.wikipedia.org/wiki/Charakteristisches_Polynom">Charakteristisches Polynom</a>, <a href="http://de.wikipedia.org/wiki/Eigenwertproblem">Eigenwertproblem</a>, <a href="http://de.wikipedia.org/wiki/Diagonalmatrix">Diagonalmatrix</a></li> <li>Skript von Herrn Prof. Dr. Leuzinger, S. 131 - 142: Determinanten.</li> </ul> Software Versioning Cheat Sheet http://martin-thoma.com/software-versioning-cheat-sheet Wed, 18 Apr 2012 05:00:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/software-versioning-cheat-sheet <p>This <a href='../images/2012/04/versioning-cheat-sheet.pdf'>Software Versioning Cheat Sheet</a> has very basic information aboout the installation and usage of Subversion and Git. (The <a href='../images/2012/04/versioning-cheat-sheet.zip'>LaTeX Source Code</a> is here.)</p> <p>If you&#39;re at the KIT and you have SWT, then you&#39;ll probably need this command:</p> <div class="highlight"><pre><code class="bash">svn checkout https://svn.ipd.kit.edu/lehre/vorlesung/SWT1/SS12/stud/ SWT/ --username swt1 </code></pre></div> <p>You will be asked for a password. I hope you remember it.</p> <h2>SVN</h2> <div class="highlight"><pre><code class="bash">svn co URL LocalTarget --username yourUserName </code></pre></div> <p>Source: <a href="http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.checkout.html">svn checkout</a></p> <div class="highlight"><pre><code class="bash">svn up </code></pre></div> <p>Source: <a href="http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.update.html">svn update</a></p> <div class="highlight"><pre><code class="bash">svn log -l 4 </code></pre></div> <p>Source: <a href="http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.log.html">svn log</a></p> <h3>Updating the repository</h3> <p>You can update a SVN repository with this command:</p> <div class="highlight"><pre><code class="bash">svn up <span class="o">[</span>path<span class="o">]</span> </code></pre></div> <p>If you need to execute the command often, you might want to define an alias. aliases are shorthands for long commands in the bash. To create a permanent one, add the following line to your ~/.bashrc file:</p> <div class="highlight"><pre><code class="bash"><span class="nb">alias </span><span class="nv">swt</span><span class="o">=</span><span class="s1">&#39;svn up /home/moose/Studium/SWT&#39;</span> </code></pre></div> <p>Now you only have to enter &quot;swt&quot; to execute &quot;svn up /home/moose/Studium/SWT&quot;.</p> <h3>Nice diffs</h3> <p>You can modify your config file:</p> <div class="highlight"><pre><code class="bash">gedit ~/.subversion/config </code></pre></div> <p>and change <code>diff-cmd</code> to <code>meld</code>.</p> <h3>Compare revisions</h3> <div class="highlight"><pre><code class="bash">svn diff -r 63:64 </code></pre></div> <p>compares revision number 63 with revision number 64 with the tool you defined (see Nice diffs).</p> <h2>Git</h2> <h3>Nice diffs</h3> <p>If you want a GUI for <code>git diff</code>, then you should do the following:</p> <p>Install meld:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install meld </code></pre></div> <p>Got to <code>/bin</code> and create a Shell-Script called <strong>git-meld</strong> with the following content:</p> <div class="highlight"><pre><code class="bash"><span class="c">#!/bin/bash</span> meld <span class="s2">&quot;`$2&quot;</span> <span class="s2">&quot;$`5&quot;</span> </code></pre></div> <p>Make it executable:</p> <div class="highlight"><pre><code class="bash">chmod +x git-meld </code></pre></div> <p>Add it to your git configuration:</p> <div class="highlight"><pre><code class="bash">git config --global diff.external git-meld </code></pre></div> <p>Enjoy this experience when entering <code>git diff</code>: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/git-meld-300x129.png"><img src="../images/2012/04/git-meld-300x129.png" alt="" width="300" height="129" class="size-medium wp-image-35541"/></a><p class="wp-caption-text"></p></div></p> <p>See also <a href="http://jeetworks.org/node/90">jeetworks.org</a> for some other solutions.</p> <h3>GitHub</h3> <h4>Preparation</h4> <p>Read the guide &quot;<a href="https://help.github.com/articles/generating-ssh-keys">Generating SSH keys</a>&quot; for more information on SSH and &quot;<a href="http://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup">Getting Started - First-Time Git Setup</a>&quot; for Git-specific questions.</p> <div class="highlight"><pre><code class="bash"><span class="nb">cd</span> ~/.ssh ssh-keygen -t rsa -C <span class="s2">&quot;info@martin-thoma.de&quot;</span> git config --global user.name <span class="s2">&quot;Martin Thoma&quot;</span> git config --global user.email info@martin-thoma.de </code></pre></div> <h4>Clone</h4> <p>Clone a GITHub repository:</p> <div class="highlight"><pre><code class="bash">git clone git@github.com:MartinThoma/matrix-multiplication.git </code></pre></div> <h3>Snippets</h3> <p>Reset a single file to the latest revision on the server:</p> <div class="highlight"><pre><code class="bash">git checkout HEAD file/to/restore </code></pre></div> <p>Get the latest diff:</p> <div class="highlight"><pre><code class="bash">git diff HEAD @<span class="o">{</span>1<span class="o">}</span> </code></pre></div> <h2>Resources</h2> <ul> <li><a href="http://svnbook.red-bean.com/en/1.6/">Version Control with Subversion</a>: a great explanation how to use subversion, e.g. <a href="http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.export.html">svn export</a></li> <li>StackOverflow: <a href="http://stackoverflow.com/questions/3233059/basic-subversion-question">Which files should be put under version controll?</a></li> <li>GitHub: <a href="http://help.github.com/remotes/">Remotes</a></li> </ul> URL shortener http://martin-thoma.com/url-shortener Mon, 16 Apr 2012 13:12:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/url-shortener <p>URL shortening services are Websites, which offer redirections from one of their pages with short URLs to your page (with a long URL). URL shortening services are great when you need to print URLs. I don&#39;t like them on Websites / in Emails as I can&#39;t see the target, but I don&#39;t want to type so much when I get a URL in my real live.</p> <p>These services should be used more often in my university. It&#39;s ridiculous that all students have to note very long URLs in the first few days. It&#39;s not a real problem, but using URL shorteners would be better.</p> <p>I&#39;ll describe some services in the following article.<a id="more"></a><a id="more-22501"></a></p> <h2>bitly</h2> <p>Long URL: <a href="https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung">https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung</a> (66 characters) Short URL: <a href="http://bit.ly/HKEKD0">http://bit.ly/HKEKD0</a> (20 characters) Custom URL: <a href="http://bit.ly/SWT-List">http://bit.ly/SWT-List</a> (22 characters, but you need to sign up for free)</p> <p>Bitly does not re-use old links (<a href="https://bitly.com/pages/help#i_1_4">source</a>). You get additional information by adding a + sing at the end: <a href="http://bit.ly/HKEKD0+">http://bit.ly/HKEKD0+</a>, <a href="http://bit.ly/SWT-List+">http://bit.ly/SWT-List+</a></p> <h2>TinyURL</h2> <p>Long URL: <a href="https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung">https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung</a> (66 characters) Short URL: <a href="http://tinyurl.com/87oscxb">http://tinyurl.com/87oscxb</a> (26 characters) Custom URL: <a href="http://tinyurl.com/SWT-List">http://tinyurl.com/SWT-List</a> (27 characters)</p> <h2>Goo.gl</h2> <p>Long URL: <a href="https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung">https://lists.ira.uni-karlsruhe.de/mailman/listinfo/swt1-vorlesung</a> (66 characters) Short URL: <a href="http://goo.gl/z5cp0">http://goo.gl/z5cp0</a> (19 characters) Custom URL: Not possible</p> <p>This service is owned by Google.</p> <p>Links do not expire and nobody can change them (<a href="http://support.google.com/websearch/bin/answer.py?hl=en&answer=190768">source</a>).</p> <h2>See also</h2> <ul> <li><a href="http://mashable.com/2008/01/08/url-shortening-services/">URL Toolbox: 90+ URL Shortening Services</a> - if you wish to see some more</li> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Bitly">bitly</a>, <a href="http://en.wikipedia.org/wiki/TinyURL">TinyURL</a></li> </ul> Eigenwerte, Eigenvektoren und Eigenräume http://martin-thoma.com/eigenwerte-eigenvektoren-und-eigenraume Mon, 16 Apr 2012 06:15:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/eigenwerte-eigenvektoren-und-eigenraume <p><strong>Eigenwerte</strong> sind Elemente des K&ouml;rpers <code>$\mathbb{K}$</code> zu einem Endomorphismus <code>$\Phi:V \rightarrow V$</code>, die folgende Eigenschaft erf&uuml;llen: <code>$\Phi(x) = \lambda x$</code> mit <code>$x \in V$</code> und <code>$x \neq 0$</code></p> <p>Alle Vektoren x sind <strong>Eigenvektoren</strong> zu diesem Eigenwert.</p> <p>Zusammen mit dem Null-Vektor bilden alle Eigenvektoren zu einem Eigenwert einer linearen Abbildung <code>$\Phi$</code> einen <strong>Eigenraum</strong>. Diesen Eigenraum bezeichnet man mit <code>$E_\lambda$</code>.</p> <h2>Interessante S&auml;tze</h2> <ul> <li>`$E_{\lambda_1} \cap E_{\lambda_2} = \emptyset$`</li> <li>Ein Endomorphismus `$\Phi$` eines n-dimensionalen `$\mathbb{K}$`-Vektorraumes hat h&ouml;chstens n Eigenwerte.</li> <li>Eine lineare Abbildung `$\Phi$` ist genau dann diagonalisierbar, wenn es eine Basis von V aus Eigenvektoren gibt.</li> <li>Wenn eine lineare Abbildung eines n-dimensionalen Vektorraums n verschiedene Eigenwerte hat, so ist sie diagonalisierbar.</li> </ul> <h2>Beispiele</h2> <h3>Etwas einfaches</h3> <p>Sei <code>$\Phi:\mathbb{R}^3 \rightarrow \mathbb{R}^3$</code> definiert durch <code>$\Phi(x) := x $</code>. Dann ist <code>$\lambda = 1$</code> der einzige Eigenwert. Der gesamte <code>$\mathbb{R}^3 \setminus \begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix}$</code> besteht ausschlie&szlig;lich aus Eigenvektoren zu diesem Eigenwert. Also ist der dazugeh&ouml;rige Eigenraum der gesamte <code>$\mathbb{R}^3$</code>.</p> <h3>Noch immer leicht</h3> <p>Sei <code>$\Phi:\mathbb{R}^3 \rightarrow \mathbb{R}^3$</code> definiert durch <code>$\Phi(x) := ax $</code> mit <code>$a \in \mathbb{R} \setminus \{0\}$</code>. Dann ist <code>$\lambda = a$</code> der einzige Eigenwert. Der gesamte <code>$\mathbb{R}^3 \setminus \begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix}$</code> besteht ausschlie&szlig;lich aus Eigenvektoren zu diesem Eigenwert. Also ist der dazugeh&ouml;rige Eigenraum der gesamte <code>$\mathbb{R}^3$</code>.</p> <h3>Etwas schwerer</h3> <p>Sei <code>$\Phi:\mathbb{R}^3 \rightarrow \mathbb{R}^3$</code> definiert durch <code>$\Phi(x) := \begin{pmatrix} 1 &amp; 2 &amp; 3\\ 4 &amp; 5 &amp; 6 \\ 7 &amp; 8 &amp; 9 \end{pmatrix} x $</code>.</p> <p>Die Eigenwerte sind laut <a href="http://www.wolframalpha.com/input/?i=Eigenvalues+%7B%7B1%2C2%2C3%7D%2C%7B4%2C5%2C6%7D%2C%7B7%2C8%2C9%7D%7D">Wolfram|Alpha</a>: <code>$\lambda_1 = \frac{3}{2} (5+\sqrt{33})$</code>, Eigenvektor: <code>$v_1 = \begin{pmatrix}-\frac{13}{11}+\frac{1}{22} (15+3 \sqrt{33}) \\ -\frac{1}{11}+\frac{1}{44} (15+3 \sqrt{33}) \\ 1\end{pmatrix}$</code> <code>$\lambda_2 = \frac{3}{2} (5-\sqrt{33})$</code>, Eigenvektor: <code>$v_2 = \begin{pmatrix}-\frac{13}{11}+\frac{1}{22} (15+3 \sqrt{33}) \\ -\frac{1}{11}+\frac{1}{44} (15-3 \sqrt{33}) \\ 1\end{pmatrix}$</code> <code>$\lambda_3 = 0$</code>, Eigenvektor: <code>$v_3 = \begin{pmatrix}1 \\ -2 \\ 1\end{pmatrix}$</code> - der Kern von <code>$\Phi$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=NullSpace+%7B%7B1%2C2%2C3%7D%2C%7B4%2C5%2C6%7D%2C%7B7%2C8%2C9%7D%7D">Wolfram|Alpha</a>)</p> <h2>Wozu das Ganze?</h2> <p>Mit Eigenwerten (bzw. Vektoren) kann man &uuml;berpr&uuml;fen, ob eine lineare Abbildung diagonalisierbar ist. Eine lineare Abbildung in Form einer Diagonalmatrix ist besonders leicht zu berechnen. Es ist also w&uuml;nschenswert, die Abbildungsmatrix in Diagonalform zu bringen.</p> <p>Kennt jemand noch weitere Gr&uuml;nde, warum Eigenwerte / Vektoren / R&auml;ume interessant sind?</p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Eigenwertproblem">Eigenwertproblem</a></li> <li>Albrecht Beutelspacher: Lineare Algebra. 7 Auflage. Vieweg+Teubner Verlag, Wiesbaden 2010, ISBN 978-3-528-66508-1, S. 202-207.</li> <li>Enrico Leuzinger: Skript zur Linearen Algebra I. S. 143-147.</li> </ul> Lernkontrolle: Lineare Algebra I http://martin-thoma.com/lernkontrolle-lineare-algebra-i Sun, 15 Apr 2012 14:50:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/lernkontrolle-lineare-algebra-i <p>Hier sind ein paar <a href='../images/2012/04/lernkontrolle-lineare-algebra.pdf'>Fragen zur Linearen Algebra I</a> und die <a href='../images/2012/04/lernkontrolle-lineare-algebra-loesung.pdf'>Antworten</a> dazu. Die <a href='../images/2012/04/LA-lernkontrolle.zip'>LaTeX-Dokumente</a> gibts nat&uuml;rlich auch.</p> <p>Bei ein paar Fragen, bin ich mir nicht sicher wie die Antwort lautet. Ich habs immer dazu geschrieben.</p> <p>Wenn ihr Fehler findet, hinterlasst bitte einfach hier einen Kommentar. Ich verbessere es dann. Wenn ihr gute Beispiele / Gegenbeispiele oder sogar weitere Fragen habt, k&ouml;nnt ihr das auch gerne in den Kommentaren schreiben.</p> <h2>Material und Quellen</h2> <p>Einige Fragen (und dazugeh&ouml;rige Antworten) sind so, oder so &auml;hnlich, in folgendem Buch zu finden, das ich sehr weiterempfehlen kann:</p> <p>Albrecht Beutelspacher: Lineare Algebra, ISBN 978-3-528-66508-1.</p> Google Code Jam 2012 - Qualification Round http://martin-thoma.com/google-code-jam-2012-qualification-round Sun, 15 Apr 2012 11:35:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-code-jam-2012-qualification-round <p>I&#39;ve passed the <a href="https://code.google.com/codejam/contest/1460488/dashboard">Qualification Round</a> of Google Code Jam 2012. I&#39;ve learned, that I am not allowed to submit the large dataset after the first 8 minutes. </p> <p>18,365 programmers took part in this contest. 15,692 had at least 20 points and advanced to the First Rounds.</p> <p>These are my solutions:</p> <h2>Problem A: Speaking in Tongues</h2> <p>This one was easy. It&#39;s a <a href="http://en.wikipedia.org/wiki/Simple_substitution#Simple_substitution">simple substitution cipher</a>:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s">&quot;ynficwlbkuomxsevzpdrjgthaq&quot;</span><span class="p">,</span> <span class="n">alphabet</span><span class="o">=</span><span class="s">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span><span class="p">):</span> <span class="n">dic</span><span class="o">=</span><span class="p">{}</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">key</span><span class="p">)):</span> <span class="n">dic</span><span class="p">[</span><span class="n">key</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">alphabet</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">plaintext</span><span class="o">=</span><span class="s">&quot;&quot;</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">ciphertext</span><span class="p">:</span> <span class="k">if</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">dic</span><span class="p">:</span> <span class="n">l</span><span class="o">=</span><span class="n">dic</span><span class="p">[</span><span class="n">l</span><span class="p">]</span> <span class="n">plaintext</span><span class="o">+=</span><span class="n">l</span> <span class="k">return</span> <span class="n">plaintext</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">cipher</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">decode</span><span class="p">(</span><span class="n">cipher</span><span class="p">)))</span> </code></pre></div> <p>A minimalistic python solution for this one was suggested by Niklas B. He makes use of <a href="http://docs.python.org/reference/expressions.html#lambda">Lambdas</a>, <a href="http://docs.python.org/library/stdtypes.html#str.translate">str.translate()</a> and <a href="http://docs.python.org/library/string.html#string.maketrans">str.maketrans()</a>:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">string</span> <span class="kn">as</span> <span class="nn">s</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="n">key</span> <span class="o">=</span> <span class="s">&quot;ynficwlbkuomxsevzpdrjgthaq&quot;</span> <span class="n">decode</span><span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">maketrans</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">ascii_lowercase</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="k">print</span> <span class="n">decode</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> </code></pre></div> <h2>Problem B: Dancing With the Googlers</h2> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">ceil</span><span class="p">,</span> <span class="n">floor</span> <span class="k">def</span> <span class="nf">line2intlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">getDist</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="n">isSurprising</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="n">p</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">points</span> <span class="o">/</span> <span class="mf">3.0</span><span class="p">)</span> <span class="n">trip</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">p</span><span class="p">]</span> <span class="k">if</span> <span class="mi">3</span><span class="o">*</span><span class="n">p</span> <span class="o">&lt;</span> <span class="n">points</span><span class="p">:</span> <span class="n">trip</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">p</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">points</span><span class="p">:</span> <span class="n">trip</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">trip</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="k">if</span> <span class="n">isSurprising</span> <span class="ow">and</span> <span class="p">(</span><span class="n">trip</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">trip</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">and</span> <span class="n">trip</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">trip</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span> <span class="n">trip</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">trip</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="k">return</span> <span class="n">trip</span> <span class="k">def</span> <span class="nf">maxGooglers</span><span class="p">(</span><span class="n">nrOfGooglers</span><span class="p">,</span> <span class="n">surprising</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">points</span><span class="p">):</span> <span class="n">mg</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">surp</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">pi</span> <span class="ow">in</span> <span class="n">points</span><span class="p">:</span> <span class="n">trip</span> <span class="o">=</span> <span class="n">getDist</span><span class="p">(</span><span class="n">pi</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="k">if</span> <span class="n">ceil</span><span class="p">(</span><span class="n">pi</span><span class="o">/</span><span class="mf">3.0</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">p</span><span class="p">:</span> <span class="n">mg</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">elif</span> <span class="n">trip</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">p</span><span class="p">:</span> <span class="n">surp</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">mg</span> <span class="o">+=</span> <span class="nb">min</span><span class="p">(</span><span class="n">surp</span><span class="p">,</span> <span class="n">surprising</span><span class="p">)</span> <span class="k">return</span> <span class="n">mg</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">originalList</span> <span class="o">=</span> <span class="n">line2intlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> <span class="n">nrOfGooglers</span> <span class="o">=</span> <span class="n">originalList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">surprising</span> <span class="o">=</span> <span class="n">originalList</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">p</span> <span class="o">=</span> <span class="n">originalList</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="n">points</span> <span class="o">=</span> <span class="n">originalList</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">maxGooglers</span><span class="p">(</span><span class="n">nrOfGooglers</span><span class="p">,</span> <span class="n">surprising</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">points</span><span class="p">)))</span> </code></pre></div> <h2>Problem C: Recycled Numbers</h2> <p>The small dataset of this one was easy, but I had to change my code a bit to make it work for the large dataset. Sadly, I didn&#39;t know that I only have 8 minutes to get it work :-(</p> <p>I&#39;ve tried cPickle for the 2,000,000 list. It took 128.7 MB and 1 minute 6.287s for the large data set after it was pickled. Without pickling it took 1 minute 31.900s.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">cPickle</span> <span class="kn">as</span> <span class="nn">pickle</span> <span class="k">except</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">pickle</span> <span class="k">def</span> <span class="nf">line2intlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">binomialCoefficient</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span> <span class="k">if</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">k</span> <span class="o">&gt;</span> <span class="n">n</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">k</span> <span class="o">&gt;</span> <span class="n">n</span> <span class="o">-</span> <span class="n">k</span><span class="p">:</span> <span class="c"># take advantage of symmetry</span> <span class="n">k</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="n">k</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">):</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">*</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)))</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">//</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="n">c</span> <span class="c">#return n * (n - 1) / 2</span> <span class="k">def</span> <span class="nf">rot</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">rot</span><span class="p">):</span> <span class="n">num</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="n">num</span> <span class="o">=</span> <span class="n">num</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">num</span><span class="p">)</span><span class="o">-</span><span class="n">rot</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">num</span><span class="p">)]</span> <span class="o">+</span> <span class="n">num</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">num</span><span class="p">)</span><span class="o">-</span><span class="n">rot</span><span class="p">]</span> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">def</span> <span class="nf">getRotList</span><span class="p">(</span><span class="n">num</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Only return bigger rotated ones &quot;&quot;&quot;</span> <span class="n">rotList</span> <span class="o">=</span> <span class="p">[</span><span class="n">num</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">num</span><span class="p">))):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">rot</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">if</span> <span class="n">tmp</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">rotList</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">tmp</span><span class="p">))</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">num</span><span class="p">)):</span> <span class="n">rotList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> <span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">rotList</span><span class="p">)</span> <span class="k">def</span> <span class="nf">inBorder</span><span class="p">(</span><span class="n">rotations</span><span class="p">,</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">):</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">rotations</span><span class="p">:</span> <span class="k">if</span> <span class="n">A</span> <span class="o">&lt;=</span> <span class="n">el</span> <span class="ow">and</span> <span class="n">el</span> <span class="o">&lt;=</span> <span class="n">B</span><span class="p">:</span> <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">count</span> <span class="k">def</span> <span class="nf">recycled</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">liste</span><span class="p">):</span> <span class="n">pairs</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">minList</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">B</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">tmpList</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">[</span><span class="n">A</span><span class="p">:</span><span class="n">B</span><span class="o">+</span><span class="mi">1</span><span class="p">]:</span> <span class="k">if</span> <span class="n">minList</span><span class="p">[</span><span class="n">tmpList</span><span class="p">[</span><span class="mi">0</span><span class="p">]]:</span> <span class="n">nrInBorder</span> <span class="o">=</span> <span class="n">inBorder</span><span class="p">(</span><span class="n">tmpList</span><span class="p">,</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">)</span> <span class="n">pairs</span> <span class="o">+=</span> <span class="n">binomialCoefficient</span><span class="p">(</span><span class="n">nrInBorder</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">minList</span><span class="p">[</span><span class="n">tmpList</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">return</span> <span class="n">pairs</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">liste</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">try</span><span class="p">:</span> <span class="n">liste</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span> <span class="s">&quot;save.p&quot;</span><span class="p">,</span> <span class="s">&quot;rb&quot;</span> <span class="p">))</span> <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2000001</span><span class="p">):</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">getRotList</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="n">liste</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">liste</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span> <span class="s">&quot;save.p&quot;</span><span class="p">,</span> <span class="s">&quot;wb&quot;</span> <span class="p">))</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="n">line2intlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">recycled</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">liste</span><span class="p">)))</span> </code></pre></div> <h2>Problem D: Hall of Mirrors</h2> <p>This one was very hard. I had some ideas, but none of them seemed to work. </p> <p>This is a solution based on the solution of &quot;dwenzel&quot;. At the moment, I&#39;ve only made some comments and broke some lines to let them fit into my blog. This solution needs about 2 minutes 42 seconds for the small input set and 2 minutes 12 seconds for the large input set.</p> <p>You might also be interested in the <a href="http://code.google.com/codejam/contest/1460488/dashboard#s=a&a=3">official Contest Analysis</a> with some hints to this challenge.</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">floor</span><span class="p">,</span> <span class="n">ceil</span><span class="p">,</span> <span class="n">sqrt</span> <span class="n">precision</span> <span class="o">=</span> <span class="mf">0.01</span> <span class="k">def</span> <span class="nf">line2intlist</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">]</span> <span class="k">return</span> <span class="n">numbers</span> <span class="k">def</span> <span class="nf">seeReflection</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span> <span class="n">cur_y</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cur_x</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">vy</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">vx</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">dist</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">dist</span> <span class="o">&lt;=</span> <span class="n">d</span> <span class="o">+</span> <span class="n">precision</span><span class="p">:</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_x</span> <span class="o">-</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">precision</span> <span class="ow">and</span> \ <span class="nb">abs</span><span class="p">(</span><span class="n">cur_y</span> <span class="o">-</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">precision</span> <span class="ow">and</span> <span class="n">dist</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">vx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">cur_x</span> <span class="o">-=</span> <span class="mf">0.5</span> <span class="k">else</span><span class="p">:</span> <span class="n">cur_x</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_x</span> <span class="o">-</span> <span class="nb">round</span><span class="p">(</span><span class="n">cur_x</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">cur_y</span><span class="p">))</span> <span class="k">if</span> <span class="n">vx</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="n">tmp</span><span class="p">][</span><span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">cur_x</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vx</span> <span class="o">=</span> <span class="o">-</span><span class="n">vx</span> <span class="k">elif</span> <span class="n">vx</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="n">tmp</span><span class="p">][</span><span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">cur_x</span><span class="p">))]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vx</span> <span class="o">=</span> <span class="o">-</span><span class="n">vx</span> <span class="n">dist</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="k">elif</span> <span class="n">vx</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">cur_y</span> <span class="o">-=</span> <span class="mf">0.5</span> <span class="k">else</span><span class="p">:</span> <span class="n">cur_y</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_y</span> <span class="o">-</span> <span class="nb">round</span><span class="p">(</span><span class="n">cur_y</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="n">tmp</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">cur_x</span><span class="p">))</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">cur_y</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)][</span><span class="n">tmp</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vy</span> <span class="o">=</span> <span class="o">-</span><span class="n">vy</span> <span class="k">elif</span> <span class="n">vy</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">cur_y</span><span class="p">))][</span><span class="n">tmp</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vy</span> <span class="o">=</span> <span class="o">-</span><span class="n">vy</span> <span class="n">dist</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="k">else</span><span class="p">:</span> <span class="c"># Find how far is the next time we hit something </span> <span class="c"># .0 or .5</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">cur_y</span> <span class="o">-</span> <span class="n">floor</span><span class="p">(</span><span class="n">cur_y</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">ceil</span><span class="p">(</span><span class="n">cur_y</span><span class="p">)</span> <span class="o">-</span> <span class="n">cur_y</span> <span class="k">if</span> <span class="n">dy</span> <span class="o">&gt;</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="n">precision</span><span class="p">:</span> <span class="n">dy</span> <span class="o">-=</span> <span class="mf">0.5</span> <span class="k">elif</span> <span class="n">dy</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="n">dy</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="k">if</span> <span class="n">vx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">dx</span> <span class="o">=</span> <span class="n">cur_x</span> <span class="o">-</span> <span class="n">floor</span><span class="p">(</span><span class="n">cur_x</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">dx</span> <span class="o">=</span> <span class="n">ceil</span><span class="p">(</span><span class="n">cur_x</span><span class="p">)</span> <span class="o">-</span> <span class="n">cur_x</span> <span class="k">if</span> <span class="n">dx</span> <span class="o">&gt;</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="n">precision</span><span class="p">:</span> <span class="n">dx</span> <span class="o">-=</span> <span class="mf">0.5</span> <span class="k">elif</span> <span class="n">dx</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="n">dx</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="c"># See which will come up first</span> <span class="n">ty</span> <span class="o">=</span> <span class="n">dy</span> <span class="o">/</span> <span class="nb">abs</span><span class="p">(</span><span class="n">vy</span><span class="p">)</span> <span class="n">tx</span> <span class="o">=</span> <span class="n">dx</span> <span class="o">/</span> <span class="nb">abs</span><span class="p">(</span><span class="n">vx</span><span class="p">)</span> <span class="k">if</span> <span class="n">ty</span> <span class="o">&gt;</span> <span class="n">tx</span><span class="p">:</span> <span class="n">t</span> <span class="o">=</span> <span class="n">tx</span> <span class="k">else</span><span class="p">:</span> <span class="n">t</span> <span class="o">=</span> <span class="n">ty</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">vy</span> <span class="o">*</span> <span class="n">t</span> <span class="n">dx</span> <span class="o">=</span> <span class="n">vx</span> <span class="o">*</span> <span class="n">t</span> <span class="n">cur_y</span> <span class="o">=</span> <span class="n">cur_y</span> <span class="o">+</span> <span class="n">dy</span> <span class="n">cur_x</span> <span class="o">=</span> <span class="n">cur_x</span> <span class="o">+</span> <span class="n">dx</span> <span class="n">dist</span> <span class="o">+=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">dy</span> <span class="o">*</span> <span class="n">dy</span> <span class="o">+</span> <span class="n">dx</span> <span class="o">*</span> <span class="n">dx</span><span class="p">)</span> <span class="n">roundy</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">cur_y</span><span class="p">)</span> <span class="n">roundx</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">cur_x</span><span class="p">)</span> <span class="n">ybounce</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">xbounce</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_y</span> <span class="o">-</span> <span class="n">roundy</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">precision</span> <span class="ow">and</span> \ <span class="nb">abs</span><span class="p">(</span><span class="n">cur_x</span> <span class="o">-</span> <span class="n">roundx</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="c"># Case we&#39;re at a corner</span> <span class="n">neighbors</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">intx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundx</span><span class="p">)</span> <span class="n">inty</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundy</span><span class="p">)</span> <span class="n">neighbors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="n">inty</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">intx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="n">neighbors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="n">inty</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">intx</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="n">neighbors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="n">inty</span><span class="p">][</span><span class="n">intx</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="n">neighbors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="n">inty</span><span class="p">][</span><span class="n">intx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="nb">sum</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">neighbor</span> <span class="ow">in</span> <span class="n">neighbors</span><span class="p">:</span> <span class="nb">sum</span> <span class="o">+=</span> <span class="n">neighbor</span> <span class="k">if</span> <span class="nb">sum</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">nexty</span> <span class="o">=</span> <span class="n">inty</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">nexty</span> <span class="o">=</span> <span class="n">inty</span> <span class="k">if</span> <span class="n">vx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">nextx</span> <span class="o">=</span> <span class="n">intx</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">nextx</span> <span class="o">=</span> <span class="n">intx</span> <span class="k">if</span> <span class="n">m</span><span class="p">[</span><span class="n">nexty</span><span class="p">][</span><span class="n">nextx</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">elif</span> <span class="nb">sum</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> <span class="n">vy</span> <span class="o">=</span> <span class="o">-</span><span class="n">vy</span> <span class="n">vx</span> <span class="o">=</span> <span class="o">-</span><span class="n">vx</span> <span class="k">elif</span> <span class="nb">sum</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="k">if</span> <span class="n">neighbors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">neighbors</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="n">vy</span> <span class="o">=</span> <span class="o">-</span><span class="n">vy</span> <span class="k">elif</span> <span class="n">neighbors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">neighbors</span><span class="p">[</span><span class="mi">3</span><span class="p">]:</span> <span class="n">vx</span> <span class="o">=</span> <span class="o">-</span><span class="n">vx</span> <span class="k">elif</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_y</span> <span class="o">-</span> <span class="n">roundy</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="c"># Case we&#39;re middle of a top/bottom edge</span> <span class="k">if</span> <span class="n">vy</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">inty</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundy</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">inty</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundy</span><span class="p">)</span> <span class="n">intx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">cur_x</span><span class="p">))</span> <span class="k">if</span> <span class="n">m</span><span class="p">[</span><span class="n">inty</span><span class="p">][</span><span class="n">intx</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vy</span> <span class="o">=</span> <span class="o">-</span><span class="n">vy</span> <span class="k">elif</span> <span class="nb">abs</span><span class="p">(</span><span class="n">cur_x</span> <span class="o">-</span> <span class="n">roundx</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">precision</span><span class="p">:</span> <span class="c"># Case we&#39;re middle of a top/bottom edge</span> <span class="k">if</span> <span class="n">vx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">intx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">intx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">roundx</span><span class="p">)</span> <span class="n">inty</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">cur_y</span><span class="p">))</span> <span class="k">if</span> <span class="n">m</span><span class="p">[</span><span class="n">inty</span><span class="p">][</span><span class="n">intx</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">vx</span> <span class="o">=</span> <span class="o">-</span><span class="n">vx</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">def</span> <span class="nf">getMap</span><span class="p">(</span><span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">):</span> <span class="nb">map</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">H</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span> <span class="n">tmp</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span> <span class="k">if</span> <span class="n">char</span> <span class="o">==</span> <span class="s">&#39;.&#39;</span><span class="p">:</span> <span class="n">tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">elif</span> <span class="n">char</span> <span class="o">==</span> <span class="s">&#39;#&#39;</span><span class="p">:</span> <span class="n">tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="nb">map</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span> <span class="k">return</span> <span class="nb">map</span> <span class="k">def</span> <span class="nf">process_case</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">D</span><span class="p">):</span> <span class="n">vectors</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="n">ratios</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">D</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">D</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span> <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">j</span> <span class="ow">and</span> <span class="n">i</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="n">j</span><span class="o">*</span><span class="n">j</span> <span class="o">&lt;=</span> <span class="n">D</span> <span class="o">*</span> <span class="n">D</span><span class="p">:</span> <span class="n">ratio</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">/</span> <span class="nb">float</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="k">if</span> <span class="n">ratio</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ratios</span><span class="p">:</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="n">j</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="o">-</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="o">-</span><span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="n">j</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">j</span><span class="p">,</span> <span class="o">-</span><span class="n">i</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="o">-</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> <span class="n">vectors</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="o">-</span><span class="n">j</span><span class="p">,</span> <span class="o">-</span><span class="n">i</span><span class="p">))</span> <span class="n">ratios</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ratio</span><span class="p">)</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">None</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">H</span><span class="p">):</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">W</span><span class="p">):</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">vector</span> <span class="ow">in</span> <span class="n">vectors</span><span class="p">:</span> <span class="k">if</span> <span class="n">seeReflection</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">vector</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">D</span><span class="p">):</span> <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">count</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">testcases</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span> <span class="k">for</span> <span class="n">caseNr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">testcases</span><span class="p">):</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">D</span> <span class="o">=</span> <span class="n">line2intlist</span><span class="p">(</span><span class="nb">raw_input</span><span class="p">())</span> <span class="nb">map</span> <span class="o">=</span> <span class="n">getMap</span><span class="p">(</span><span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Case #</span><span class="si">%i</span><span class="s">: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caseNr</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">process_case</span><span class="p">(</span><span class="nb">map</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">D</span><span class="p">)))</span> </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Google_Code_Jam">Google Code Jam</a></li> <li><a href="http://www.go-hero.net/jam/12/">Google Code Jam Statistics</a></li> </ul> PHP: A strange language http://martin-thoma.com/php-a-strange-language Thu, 12 Apr 2012 14:24:32 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/php-a-strange-language <h2>Inconsistency</h2> <h3>Starting and ending PHP</h3> <p>The following snippet is valid PHP-code: [php]&lt;?php </script> ?&gt;[/php] Source: <a href="http://stackoverflow.com/q/13228306/562769">StackOverflow.com</a> (You can find some explanations there.)</p> <h3>Underscores</h3> <p>Some functions use underscores between words, while others do not: <a href="http://php.net/gettype">gettype</a> vs. <a href="http://php.net/get_class">get_class</a></p> <h3>Order of Arguments</h3> <p>[php]strpos ( string <code>$haystack , mixed $</code>needle [...] ) stristr ( string <code>$haystack , mixed $</code>needle [...] ) in<em>array ( mixed <code>$needle , array $</code>haystack [...] ) array</em>search ( mixed <code>$needle , array $</code>haystack [...] )[/php]</p> <h2>Sorting</h2> <p>[php]function pivot(<code>$arr) { return ($</code>arr[0] + end(`$arr)) / 2; }</p> <p>$<code>arr = array(1, 5, 7, 2, 3, 4, 8, 9, 6); echo pivot(sort(</code>$arr));[/php]</p> <p>This doesn&#39;t work. If you don&#39;t know why, you should take a look at <a href="http://php.net/manual/de/function.sort.php">sort</a>.</p> <h2>PHP Logo</h2> <p>Add &#39;?=PHPE9568F34-D428-11d2-A769-00AA001ACF42&#39; to any PHP script and take a look at the output. For example at <a href="http://en.wikipedia.org/wiki/Main_Page?=PHPE9568F34-D428-11d2-A769-00AA001ACF42">Wikipedia</a>.</p> <h2>Argument order</h2> <p>[php]mktime ([$<code>hour [,</code>$minute [, $<code>second [,</code>$month [, $<code>day [,</code>$year [, $`is_dst]]]]]]])[/php]</p> <h2>array_fill</h2> <p><a href="http://php.net/manual/en/function.array-fill.php">array_fill</a> doesn&#39;t allow 0 as `$number. [php]&lt;?php</p> <p>$<code>number = 2; </code>$arr = array_fill(0, $<code>number, 42); print_r(</code>$arr);</p> <p>?&gt;[/php] Array ( [0] =&gt; 42 [1] =&gt; 42 )</p> <h2>Strange loop</h2> <p>Loops themselves should not change anything. So take a look at this:</p> <p>[php]&lt;?php</p> <p>$<code>array = array(&#39;foo&#39;, &#39;bar&#39;); var_dump(</code>$array); foreach ($<code>array as &amp;amp;</code>$foo); var_dump($`array);</p> <p>?&gt;[/php] Output:</p> <div class="highlight"><pre><code class="text">array(2) { [0]=&gt; string(3) &quot;foo&quot; [1]=&gt; string(3) &quot;bar&quot; } array(2) { [0]=&gt; string(3) &quot;foo&quot; [1]=&gt; &amp;amp;string(3) &quot;bar&quot; } </code></pre></div> <h2>Boolean evaluation</h2> <p>[php]&lt;?php</p> <p>`$a = array(&#39;7.1&#39;);</p> <p>$`arr1 = array( &#39;foo&#39; =&gt; &#39;foo&#39;, &#39;bar&#39; =&gt; &#39;bar&#39;, );</p> <p>`$arr2 = array( &#39;bar&#39; =&gt; &#39;bar&#39;, &#39;foo&#39; =&gt; &#39;foo&#39;, );</p> <p>if (&quot;a&quot;) {echo &quot;This &quot;;} if (true) {echo &quot;is &quot;;} if (9) {echo &quot;PHP. &quot;;} if (07) {echo &quot;Oktal &quot;;} if (010 == 8 ) {echo &quot;is &quot;;} if (&quot;8&quot; == 8 ) {echo &quot;also &quot;;} if (array(0)) {echo &quot;true. &quot;;} if ($<code>x = 1) {echo &quot;Like &quot;;} if (in_array(&#39;7.10&#39;,</code>$a)) {echo &quot;that &quot;;} if ($<code>arr1 ==</code>$arr2) {echo &quot;one &quot;;} if (0 == &#39;x&#39;) {echo &quot;is true.&quot;;}</p> <p>if (&quot;&quot;) {echo &quot;false &quot;;} if (0) {echo &quot;false&quot;;} if (08) {echo &quot;false&quot;;} if (array()) {echo &quot;false&quot;;} if ($<code>x = 0) {echo &quot;false&quot;;} if (</code>$arr1 === $`arr2) {echo &quot;false&quot;;}</p> <p>?&gt;[/php]</p> <h2>Automatic conversion</h2> <div class="info">This one seems to be fixed. It doesn't work in PHP Version 5.4.6-1ubuntu1.2 (released 16.08.2012). It was a problem in PHP 5.3.5 (released 06.01.2011)</div> <p>PHP converts strings automatically to a float if it is possible. This might lead to problems. See this example from <a href="http://phpsadness.com/sad/47">phpsadness</a>: [php]&lt;?php</p> <p>`$password = &quot;ximaz&quot;;</p> <p>$`hash = &quot;61529519452809720693702583126814&quot;; // = md5(&quot;ximaz&quot;)</p> <p>if (md5(<code>$password) == $</code>hash) { print &quot;Allowed!\n&quot;; }</p> <p><code>$wrong_hash = &quot;61529519452809720000000000000000&quot;; if ($</code>wrong_hash == `$hash) { print &quot;Wrong hash got correct!\n&quot;; }</p> <p>?&gt;[/php]</p> <p>See also: <ul> <li><a href="http://php.net/language.operators.comparison">Comparison Operators</a></li> <li><a href="https://bugs.php.net/bug.php?id=54547">Bug #54547: wrong equality of string numbers</a></li> <li><a href="https://bugs.php.net/bug.php?id=62097">Bug #62097: New behavior of string == has a compatibility problem</a></li> <li><a href="http://de.wikipedia.org/wiki/Versionsgeschichte_von_PHP">Versionsgeschichte von PHP</a> (German)</li> </ul></p> <h2>Make a Guess</h2> <p>Try to guess what the following prints: [php]&lt;?php for ($<code>i = &#39;a&#39;;</code>$i &lt;= &#39;z&#39;; ++$<code>i) echo &quot;</code>$i &quot;;</p> <p>// I just need four NULLs to demo this. $`a = array_fill(0, 4, NULL);</p> <p><code>$a[0]++; ++$</code>a[1]; <code>$a[2]--; --$</code>a[3];</p> <p>var_dump(`$a);</p> <p>$<code>b[0]++; ++</code>$b[1]; $<code>b[2]--; --</code>$b[3];</p> <p>var_dump($`b); ?&gt;[/php]</p> <p>Did you guess the following?</p> <div class="highlight"><pre><code class="text">a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz array(4) { [0]=&gt; int(1) [1]=&gt; int(1) [2]=&gt; NULL [3]=&gt; NULL } array(4) { [0]=&gt; int(1) [1]=&gt; int(1) [2]=&gt; NULL [3]=&gt; NULL } </code></pre></div> <h2>Function names are NOT case sensitive</h2> <blockquote>[php]function add(`$a, $`b) { return `$a + $`b; } `$foo = add(1, 2); $`Foo = Add(3, 4); echo "foo is `$foo"; // outputs foo is 3 echo "Foo is $`Foo"; // outputs Foo is 7[/php]</blockquote> <p>Source: <a href="http://stackoverflow.com/a/2006635/562769">StackOverflow</a></p> <h2>Sources</h2> <ul> <li><a href="http://phpsadness.com/">phpsadness.com</a></li> <li><a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP: a fractal of bad design</a> (thanks to <a href="http://www.knallisworld.de/blog/2012/04/11/herrlicher-php-rant/">knallisworld.de</a>)</li> <li><a href="http://www.phpwtf.org/">phpwtf.org</a></li> </ul> Project Euler: Problem 142 http://martin-thoma.com/project-euler-problem-142 Sun, 08 Apr 2012 20:40:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/project-euler-problem-142 <p><a href="http://en.wikipedia.org/wiki/Project_Euler">Project Euler</a> is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.</p> <p>The motivation for starting Project Euler, and its continuation, is to provide a platform for the inquiring mind to delve into unfamiliar areas and learn new concepts in a fun and recreational context.</p> <p>Today, I would like to discuss problem 142. I&#39;ve seen a <a href="http://blog.san-ss.com.ar/2011/12/project-euler-problem-142-solved.html">post from Santiago Alessandri</a>, so I liked to do the task by myself. </p> <p>The task is: <blockquote>Find the smallest x + y + z with integers <code>$x &gt; y &gt; z &gt; 0$</code> such that x + y, x - y, x + z, x - z, y + z, y - z are all perfect squares.</blockquote></p> <p>I don&#39;t want to post the solution (if you want to cheat, I guess you could easily Google it), but some thoughts that might help you to get in the right direction.</p> <h2>First thought: Brute-force</h2> <p><a href="http://en.wikipedia.org/wiki/Brute-force_search">Brute-force</a> is the easiest way that could give you the solution. So I wrote this piece of code:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span> <span class="k">def</span> <span class="nf">is_square</span><span class="p">(</span><span class="n">integer</span><span class="p">):</span> <span class="n">root</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">integer</span><span class="p">)</span> <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">root</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">==</span> <span class="n">integer</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1000</span><span class="p">):</span> <span class="k">print</span> <span class="n">x</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span> <span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">y</span> <span class="ow">and</span> <span class="n">y</span> <span class="o">&gt;</span> <span class="n">z</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="n">is_square</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_square</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">y</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_square</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">z</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_square</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">z</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_square</span><span class="p">(</span><span class="n">y</span> <span class="o">+</span> <span class="n">z</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_square</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">z</span><span class="p">)):</span> <span class="k">print</span> <span class="p">(</span><span class="s">&quot;</span><span class="si">%i</span><span class="s"> - </span><span class="si">%i</span><span class="s"> - </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span> <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span> </code></pre></div> <p>This is quite fast until you reach about 500. So this is not a good way to solve it.</p> <h2>Apply some math</h2> <p>You can formalize the task like this: Find the smallest <code>$x, y, z \in \mathbb{N}$</code>, so that: <ol> <li><code>$x &gt; y &gt; z &gt; 0$</code></li> <li><code>$a = x + y$</code></li> <li><code>$b = x - y$</code></li> <li><code>$c = x + z$</code></li> <li><code>$d = x - z$</code></li> <li><code>$e = y + z$</code></li> <li><code>$f = y - z$</code></li> </ol></p> <p>With <code>$a, b, c, d, e, f \in Squares$</code>.</p> <p>Now you can make the following conclusions: <ol> <li><code>$\overset{A.1, A.2, A.3}{\implies} a &gt; b$</code></li> <li><code>$\overset{A.1, A.4, A.5}{\implies} c &gt; d$</code></li> <li><code>$\overset{A.1, A.6, A.7}{\implies} e &gt; f$</code></li> </ol></p> <ol> <li><p><code>$a &gt; c$</code>: <code>$y &gt; z$</code> <code>$\Leftrightarrow x + y &gt; x + z$</code> <code>$\Leftrightarrow a &gt; c$</code></p></li> <li><p><code>$c &gt; e$</code>: <code>$x &gt; y$</code> <code>$\Leftrightarrow x + z &gt; y + z$</code> <code>$c &gt; e$</code></p></li> <li><p>a is the biggest element (see B.1, B.4, B.6)</p></li> <li><p><code>$b &lt; c$</code>: <code>$-y &lt; z$</code> <code>$\Leftrightarrow x - y &lt; x + z$</code> <code>$b &lt; c$</code></p></li> <li><p>c is the second biggest element (see B.7, B.2, B.5, B.8)</p></li> <li><p><code>$b &lt; d$</code>: <code>$ y &gt; z$</code> <code>$\Leftrightarrow -y &lt; -z$</code> <code>$\Leftrightarrow x - y &lt; x - z$</code> <code>$b &lt; d$</code></p></li> <li><p><code>$d &gt; f$</code>: <code>$ x &gt; y$</code> <code>$\Leftrightarrow x - z &gt; y - z$</code> <code>$d &gt; f$</code></p></li> <li><p>I can&#39;t tell anything about the relationship between: <ul> <li>d and e</li> <li>b and f</li> <li>b and e</li> </ul></p></li> </ol> <p>Lets conclude: <div style="width: 298px" class="wp-caption aligncenter"><a href="../images/2012/04/euler-142-graph.png"><img src="../images/2012/04/euler-142-graph.png" alt="" width="298" height="400" class="size-full wp-image-21421"/></a><p class="wp-caption-text"></p></div></p> <p>You also know:</p> <p><code>$x = \frac{a - b}{2} \implies \text{ (a - b) has to be even} \implies \text{a and b have the same parity.}$</code> The same argumentation can be used for (c, d) and (e, f).</p> <p><code>$x &gt; y &gt; z &gt; 0 \land a = x + y \implies a \geq 5$</code>.</p> <p>With this in mind you don&#39;t have to loop over three variables but only over two. This is much faster. As z is over 1000 you need it. My new script took about 1.5 minutes.</p> <h2>Material</h2> <p>Some material like the LaTeX-file can be found in the <a href='../images/2012/04/euler-142.zip'>Project Euler 142 Archive</a>.</p> The Best Advertising Campaigns http://martin-thoma.com/the-best-advertising-campaigns Sun, 08 Apr 2012 20:15:57 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/the-best-advertising-campaigns <h2>Jobs in Town</h2> <table> <tr> <td> <img src="../images/2012/04/jobs-in-town-bankautomat.jpg" alt="Jobs in Town Advertising (Bankautomat)" title="Jobs in Town Advertising (Bankautomat)" width="250" height="366" class="size-full wp-image-21571" /> </td> <td> <img src="../images/2012/04/jobs-in-town-eismaschine.jpg" alt="Jobs in Town Advertising (Eismaschine)" title="Jobs in Town Advertising (Eismaschine)" width="250" height="350" class="size-full wp-image-21581" /></td> </tr> <tr> <td> <img src="../images/2012/04/jobs-in-town-kaffeeautomat.jpg" alt="Jobs in Town Advertising (Kaffeeautomat)" title="Jobs in Town Advertising (Kaffeeautomat)" width="250" height="353" class="size-full wp-image-21591" /></td> <td> <img src="../images/2012/04/jobs-in-town-kinderauto.jpg" alt="Jobs in Town Advertising (Kinderauto)" title="Jobs in Town Advertising (Kinderauto)" width="250" height="345" class="size-full wp-image-21601" /></td> </tr> <tr> <td> <img src="../images/2012/04/jobs-in-town-music-machine-ad.jpg" alt="Jobs in Town Advertising (Music Machine)" title="Jobs in Town Advertising (Music Machine)" width="250" height="344" class="size-full wp-image-21611" /></td> <td> <img src="../images/2012/04/jobs-in-town-tankstelle.jpg" alt="Jobs in Town Advertising (Tankstelle)" title="Jobs in Town Advertising (Tankstelle)" width="250" height="351" class="size-full wp-image-21621" /></td> </tr> <tr> <td colspan="2"> <img src="../images/2012/04/jobs-in-town-washing-machine.jpg" alt="Jobs in Town Advertising (Waschmaschine)" title="Jobs in Town Advertising (Waschmaschine)" width="425" height="302" class="size-full wp-image-21631" /></td> </tr> </table> <h2>FedEx</h2> <div style="width: 410px" class="wp-caption aligncenter"><a href="../images/2012/04/fedex-ad.jpg"><img src="../images/2012/04/fedex-ad.jpg" alt="" width="410" height="274" class="size-full wp-image-21661"/></a><p class="wp-caption-text"></p></div> <h2>Mr. Clean</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/mr-clean-ad.jpg"><img src="../images/2012/04/mr-clean-ad.jpg" alt="" width="425" height="289" class="size-full wp-image-21671"/></a><p class="wp-caption-text"></p></div> <h2>Tip Ex</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/tipex-ad.jpg"><img src="../images/2012/04/tipex-ad.jpg" alt="" width="425" height="531" class="size-full wp-image-21691"/></a><p class="wp-caption-text"></p></div> <h2>National Geographic Channel</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/national-geographic-channel-ad.png"><img src="../images/2012/04/national-geographic-channel-ad.png" alt="" width="425" height="449" class="size-full wp-image-21681"/></a><p class="wp-caption-text"></p></div> <h2>Tampax</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/tampax-ad.jpg"><img src="../images/2012/04/tampax-ad.jpg" alt="" width="425" height="407" class="size-full wp-image-21701"/></a><p class="wp-caption-text"></p></div> <h2>3M Security Glass</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/3m-ad.jpg"><img src="../images/2012/04/3m-ad.jpg" alt="" width="425" height="529" class="size-full wp-image-21711"/></a><p class="wp-caption-text"></p></div> <h2>Coffee</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/coffee-ad.jpg"><img src="../images/2012/04/coffee-ad.jpg" alt="" width="425" height="676" class="size-full wp-image-21721"/></a><p class="wp-caption-text"></p></div> <h2>Funeral ad</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/funeral-ad.jpg"><img src="../images/2012/04/funeral-ad.jpg" alt="" width="425" height="319" class="size-full wp-image-21731"/></a><p class="wp-caption-text"></p></div> <h2>Ravensburger</h2> <div style="width: 425px" class="wp-caption aligncenter"><a href="../images/2012/04/ravensburger-puzzle-ad.jpg"><img src="../images/2012/04/ravensburger-puzzle-ad.jpg" alt="" width="425" height="293" class="size-full wp-image-21751"/></a><p class="wp-caption-text"></p></div> Amazing Animals http://martin-thoma.com/amazing-animals Sat, 07 Apr 2012 00:39:26 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/amazing-animals <p>Some animals are truly amazing. Just take a look at them. I&#39;ve also included some video clips of funny individuals.</p> <h2>Axoltotl</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/axolotl-300x269.jpg"><img src="../images/2012/04/axolotl-300x269.jpg" alt="" width="300" height="269" class="size-medium wp-image-21171"/></a><p class="wp-caption-text"></p></div> <p>The <a href="http://en.wikipedia.org/wiki/Axolotl">axoltotl</a> is capable of the <strong>regeneration</strong> of entire lost appendages in a period of months, and, in certain cases, more vital structures. Some have indeed been found restoring the less vital parts of their brains. They can also readily accept transplants from other individuals, including eyes and parts of the brain&mdash;restoring these alien organs to full functionality. In some cases, axolotls have been known to repair a damaged limb as well as regenerating an additional one, ending up with an extra appendage that makes them attractive to pet owners as a novelty. In metamorphosed individuals, however, the ability to regenerate is greatly diminished. The axolotl is therefore used as a model for the development of limbs in vertebrates.</p> <h2>Platypus</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/Platypus-300x201.jpg"><img src="../images/2012/04/Platypus-300x201.jpg" alt="" width="300" height="201" class="size-medium wp-image-21181"/></a><p class="wp-caption-text"></p></div> <p>Together with the four species of echidna, the <a href="http://en.wikipedia.org/wiki/Platypus">platypus</a> is one of the five extant species of monotremes, the only <strong>mammals that lay eggs</strong> instead of giving birth to live young. It is one of the few <a href="http://en.wikipedia.org/wiki/Venomous_mammals">venomous mammals</a>.</p> <h2>Mimic Octopus</h2> <iframe width="512" height="377" src="http://www.youtube.com/embed/H8oQBYw6xxc" frameborder="0" allowfullscreen></iframe> <p>The <a href="http://en.wikipedia.org/wiki/Mimic_Octopus">mimic octopus</a> has a strong ability to mimic other creatures. It grows up to 60 cm (2 feet) in length. Its normal colouring consists of brown and white stripes or spots.</p> <h2>Lyrebird</h2> <iframe width="512" height="377" src="http://www.youtube.com/embed/VjE0Kdfos4Y" frameborder="0" allowfullscreen></iframe> <p>A Lyrebirds are most notable for their <strong>superb ability to mimic natural and artificial sounds</strong> from their environment. Lyrebirds have unique plumes of neutral coloured tailfeathers.</p> <h2>Chimpanzee</h2> <iframe width="512" height="290" src="http://www.youtube.com/embed/zJAH4ZJBiN8" frameborder="0" allowfullscreen></iframe> <h2>Ants</h2> <iframe width="512" height="384" src="http://www.youtube.com/embed/lFg21x2sj-M" frameborder="0" allowfullscreen></iframe> <h2>Individuals</h2> <h3>Einstein le perroquet</h3> <iframe width="512" height="377" src="http://www.youtube.com/embed/GRUgjMGLr5g" frameborder="0" allowfullscreen></iframe> <h3>Dog, Cat and Rat</h3> <iframe width="512" height="290" src="http://www.youtube.com/embed/D85yrIgA4Nk" frameborder="0" allowfullscreen></iframe> <h3>Genius dog climbs fence</h3> <iframe width="512" height="377" src="http://www.youtube.com/embed/MLssW7lyzxw" frameborder="0" allowfullscreen></iframe> <h3>Cat gets caught barking</h3> <iframe width="512" height="377" src="http://www.youtube.com/embed/aP3gzee1cps" frameborder="0" allowfullscreen></iframe> How Chrome could be improved http://martin-thoma.com/how-chrome-could-be-improved Fri, 06 Apr 2012 12:19:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-chrome-could-be-improved <p>Google Chorme is the browser of my choice. It is fast, has developer tools and looks great. But it could be improved. I&#39;ll describe some features I miss.</p> <h2>Disable sound for tabs</h2> <p>Sometimes I watch a movie while I play a flash game. Some flash games don&#39;t offer an option to mute them. So I would like to get the possibility to disable sound for one tab.</p> <p>It could look like this. <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/disable-tab-sound-300x172.png"><img src="../images/2012/04/disable-tab-sound-300x172.png" alt="" width="300" height="172" class="size-medium wp-image-20981"/></a><p class="wp-caption-text"></p></div></p> <h2>Spell checker</h2> <p>I write Blogs in German and in English. So I would like a spell-checker option at the bottom-left corner to switch languages: <div style="width: 698px" class="wp-caption aligncenter"><a href="../images/2012/04/spell-checker.png"><img src="../images/2012/04/spell-checker.png" alt="" width="698" height="91" class="size-full wp-image-21021"/></a><p class="wp-caption-text"></p></div></p> <h2>HTML5 Form Elements</h2> <p>HTML5 brought many cool new form elements to the web. If you like, take a look at <a href="http://www.martin-thoma.de/html5/input.php">my list of HTML5 input types</a>. Chrome should support all of them! Note that Chrome does support these types according to <a href="http://html5test.com/">html5test.com</a>. But I can&#39;t see any difference between type=url and type=text. That&#39;s not supporting the new types!</p> <p>By the way, at the moment Chrome scores 385 points + 13 bonus points. The best browser currently scores 425 points + 25 bonus points.</p> <div style="width: 172px" class="wp-caption aligncenter"><a href="../images/2012/04/opera-11.01-date.png"><img src="../images/2012/04/opera-11.01-date.png" alt="" width="172" height="250" class="size-full wp-image-21051"/></a><p class="wp-caption-text"></p></div> <h2>Internal PDF-Reader</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/internal-pdf-reader-300x218.png"><img src="../images/2012/04/internal-pdf-reader-300x218.png" alt="" width="300" height="218" class="size-medium wp-image-21001"/></a><p class="wp-caption-text"></p></div> <h3>Rotate PDF</h3> <p>Some PDF files I receive are rotated by 90&deg;. It would be great if I could, as in every PDF viewer, rotate this. A common shortcut is Ctrl+Arrow key.</p> <h3>Page numbers</h3> <p>It would be great, if I could enter the number of the page I want to view. For example in the URL by adding &quot;#123&quot; for page 123.</p> <h2>Security</h2> <h3>Extensions</h3> <p>Auto-Disable extensions for https. Only PayPal, Amazon, Ebay, GMail and my bank accounts work with https. I don&#39;t need my Addons for these sites and I would appreciate if I could auto-disable them for https.</p> <h3>Password Reuse Visualizer</h3> <p>Firefox offers a tool which helps to identify passwords, that get reused often. It is called &quot;<a href="https://addons.mozilla.org/de/firefox/addon/password-reuse-visualizer/">Password Reuse Visualizer</a>&quot; and looks like this:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/04/password-reuse.png"><img src="../images/2012/04/password-reuse.png" alt="" width="300" height="269" class="size-full wp-image-21101"/></a><p class="wp-caption-text"></p></div> <h2>Material</h2> <p>I&#39;ve used <a href="http://www.famfamfam.com/lab/icons/silk/">famfamfam slik icons</a>. For the menus I&#39;ve used Sans, 14pt, no hinting but Antialiasing. If someone has better options, it would be great if you posted it as a comment.</p> <p>If you just want to see if your problem has already been submitted, go to the <a href="http://code.google.com/p/chromium/issues/list">issue-list</a>.</p> Wie berechne ich das multiplikativ Inverse einer komplexen Zahl? http://martin-thoma.com/wie-berechne-ich-das-multiplikativ-inverse-einer-komplexen-zahl Wed, 04 Apr 2012 14:57:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-berechne-ich-das-multiplikativ-inverse-einer-komplexen-zahl <p>Im Folgenden werde ich kurz und b&uuml;ndig erkl&auml;ren, wie man das multiplikativ Inverse einer komplexen Zahl berechnet.</p> <h2>Beispiel</h2> <p>Berechne das multiplikativ Inverse zur komplexen Zahl <code>$(\frac{1}{10} + \frac{1}{5}i)$</code>.</p> <p>Das Ergebnis ist von der Form <code>$(c + di) \in \mathbb{C}$</code>. Es muss folgende Gleichung erf&uuml;llen: <a id="more"></a><a id="more-20591"></a> <code>$(\frac{1}{10} + \frac{1}{5}i) \cdot (c + di) = 1$</code> <code>$\Leftrightarrow (\frac{1}{10} \cdot c - \frac{1}{5} d) + (\frac{1}{5} c + \frac{1}{10} d)i = 1$</code> <code>$\Leftrightarrow (\frac{1}{10} \cdot c - \frac{1}{5} d) = 1 \land (\frac{1}{5} c + \frac{1}{10} d) = 0$</code> <code>$\Leftrightarrow \left( \begin{array}{c c | c} \frac{1}{10} &amp; -\frac{1}{5} &amp; 1 \\ \frac{1}{5} &amp; \frac{1}{10} &amp; 0 \end{array} \right) \Leftrightarrow \left( \begin{array}{c c | c} \frac{1}{10} &amp; -\frac{1}{5} &amp; 1 \\ 0 &amp; \frac{1+4}{10} &amp; -2 \end{array} \right) = \left( \begin{array}{c c | c} \frac{1}{10} &amp; -\frac{1}{5} &amp; 1 \\ 0 &amp; \frac{1}{2} &amp; -2 \end{array} \right)$</code> <code>$\Leftrightarrow \left( \begin{array}{c c | c} \frac{1}{10} &amp; -\frac{1}{5} &amp; 1 \\ 0 &amp; 1 &amp; -4 \end{array} \right) \Leftrightarrow \left( \begin{array}{c c | c} \frac{1}{10} &amp; 0 &amp; 1 - \frac{4}{5} \\ 0 &amp; 1 &amp; -4 \end{array} \right) = \left( \begin{array}{c c | c} \frac{1}{10} &amp; 0 &amp; \frac{1}{5} \\ 0 &amp; 1 &amp; -4 \end{array} \right)$</code> <code>$\Leftrightarrow \left( \begin{array}{c c | c} 1 &amp; 0 &amp; 2 \\ 0 &amp; 1 &amp; -4 \end{array} \right)$</code></p> <p>Das Ergebnis lautet also: Das multiplikativ Inverse zu <code>$(\frac{1}{10} + \frac{1}{5}i)$</code> ist <code>$(2 -4i)$</code>.</p> <h2>Allgemein</h2> <p>Berechne das multiplikativ Inverse zur komplexen Zahl <code>$(a + bi)$</code>.</p> <p>Das Ergebnis ist von der Form <code>$(c + di) \in \mathbb{C}$</code>. Es muss folgende Gleichung erf&uuml;llen: <code>$(a + bi) \cdot (c + di) = 1$</code> <code>$\Leftrightarrow (a c - b d) + (b c + a d)i = 1$</code> <code>$\Leftrightarrow (a c - b d) = 1 \land (b c + a d) = 0$</code></p> <h3>Fall 1: a ungleich 0</h3> <p><code>$\Leftrightarrow \left( \begin{array}{c c | c} a &amp; -b &amp; 1 \\ b &amp; a &amp; 0 \end{array} \right) \Leftrightarrow \left( \begin{array}{c c | c} a &amp; -b &amp; 1 \\ 0 &amp; a + \frac{b^2}{a} &amp; - \frac{b}{a} \end{array} \right) = \left( \begin{array}{c c | c} a &amp; -b &amp; 1 \\ 0 &amp; \frac{a^2 + b^2}{a} &amp; - \frac{b}{a} \end{array} \right)$</code> <code>$\Leftrightarrow \left( \begin{array}{c c | c} a &amp; -b &amp; 1 \\ 0 &amp; 1 &amp; -\frac{b}{a^2 + b^2} \end{array} \right) \Leftrightarrow \left( \begin{array}{c c | c} a &amp; 0 &amp; 1 - \frac{b^2}{a^2 + b^2} \\ 0 &amp; 1 &amp; -\frac{b}{a^2 + b^2} \end{array} \right) \Leftrightarrow \left( \begin{array}{c c | c} 1 &amp; 0 &amp; (1 - \frac{b^2}{a^2 + b^2})/a \\ 0 &amp; 1 &amp; -\frac{b}{a^2 + b^2} \end{array} \right)$</code> <code>$= \left( \begin{array}{c c | c} 1 &amp; 0 &amp; (\frac{a^2 + b^2 - b^2}{a^2 + b^2})/a \\ 0 &amp; 1 &amp; -\frac{b}{a^2 + b^2} \end{array} \right) = \left( \begin{array}{c c | c} 1 &amp; 0 &amp; \frac{a}{a^2 + b^2} \\ 0 &amp; 1 &amp; -\frac{b}{a^2 + b^2} \end{array} \right)$</code></p> <p>Das Ergebnis lautet also: Das multiplikativ Inverse zu <code>$(a + bi)$</code> ist also in diesem Fall <code>$(\frac{a}{a^2 + b^2} - \frac{b}{a^2 + b^2}i)$</code>.</p> <h3>Fall a gleich 0</h3> <p><code>$\Leftrightarrow - b d = 1 \land b c= 0$</code> <code>$\implies c = 0 \land d = - \frac{1}{b}$</code></p> <p>Das multiplikativ Inverse zu <code>$(bi)$</code> ist also in diesem Fall <code>$(0 - \frac{1}{b}i)$</code> = (\frac{0}{0^2 + b^2} - \frac{b}{0^2 + b^2}i)`$.</p> <h3>Ergebnis</h3> <p>Ganz allgemein kann man f&uuml;r das multiplikativ Inverse einer beliebigen komplexen Zahl also folgendes Angeben: $`(\frac{a}{a^2 + b^2} - \frac{b}{a^2 + b^2}i)$.</p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Komplexe_Zahl">Komplexe Zahlen</a>, <a href="http://de.wikipedia.org/wiki/Inverses_Element">Inverses Element</a></li> </ul> How to install the latest LaTeX Version http://martin-thoma.com/how-to-install-the-latest-latex-version Wed, 28 Mar 2012 09:29:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-install-the-latest-latex-version <p>I recently had <a href="http://tex.stackexchange.com/questions/49543/how-can-i-place-numbers-into-marks-of-a-plot">some problems</a> with TikZ because of my outdated LaTeX-Version. Ubuntu does only provide TeX Live 2009. The latest one is TeX Live 2012. As Ubuntu doesn&#39;t provide the latest LaTeX-Code, I&#39;ll explain how to install it by yourself on an Ubuntu System.</p> <h2>What is LaTeX?</h2> <p>LaTeX is a document markup language. So with LaTeX you&#39;re able to write math formula like <code>$\sum_{i=0}^\infty \frac{1}{2^i} = 2$</code>. The term LaTeX refers only to the language in which documents are written, not to the editor used to write those documents. In order to create a document in LaTeX, a .tex file must be created using some form of text editor. While most text editors can be used to create a LaTeX document, a number of editors have been created specifically for working with LaTeX.</p> <p>A number of TeX distributions are available, including TeX Live (multiplatform) and MiKTeX (Windows). When I write &quot;LaTeX&quot; I think of &quot;TeX Live&quot;.</p> <h2>LaTeX: an Hello World example</h2> <p>This is the template I use when I want to write a minimal LaTeX PDF document. You can use it as an example.</p> <div class="highlight"><pre><code class="text">\documentclass[a4paper,10pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage{amsthm} % needed for proof environment \usepackage[utf8]{inputenc} % this is needed for umlauts \usepackage[ngerman]{babel} % this is needed for umlauts \usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf \usepackage{geometry} \geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} \pdfinfo{ /Author (Martin Thoma) /Title (Analysis I) /Subject (Analysis I) /Keywords (Analysis I; Venn-Diagramm) } \newtheorem*{vor}{Voraussetzung} \newtheorem*{beh}{Behauptung} \begin{document} \section{Hello World} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \subsection{This is an subsection} Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse \end{document} </code></pre></div> <p>If LaTeX is available on your system, you can create the PDF file from this myDocument.tex file with this command:</p> <div class="highlight"><pre><code class="bash">pdflatex myDocument.tex -output-format<span class="o">=</span>pdf </code></pre></div> <p>This will create a .log file, an .aux file</p> <p>Here is the <a href='../images/2012/03/latex-template.zip'>LaTeX template</a> with the resulting PDF.</p> <h2>Install the latest LaTeX</h2> <div class="important">Follow the instructions on <a href="http://tug.org/texlive/acquire-netinstall.html">tug.org</a>.</div> <p>It&#39;s a Network installation, so it will need Internet access. It needs to download about 2 GB so it will take some time. But everything is done automatically.</p> <p>You should remove your old installation before you start the new one:</p> <div class="highlight"><pre><code class="bash">sudo apt-get purge texlive-* sudo apt-get autoremove </code></pre></div> <div class="highlight"><pre><code class="bash">wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz tar -zxvf install-tl-unx.tar.gz <span class="nb">cd </span>install-tl-* sudo ./install-tl I </code></pre></div> <p>After you&#39;ve started your installation, you can choose options (O). Then you should choose &quot;create symlinks in standard directories&quot; (L).</p> <p>If you didn&#39;t do so, add the path to your PATH (See <a href="http://askubuntu.com/a/60221/10425">How to add a directory to my path?</a>, <a href="http://askubuntu.com/a/60769/10425">How do I add a directory to MANPATH or INFOPATH?</a> and <a href="http://askubuntu.com/a/59127/10425">Reload .profile</a>):</p> <div class="highlight"><pre><code class="bash"><span class="nv">PATH</span><span class="o">=</span><span class="sb">`</span><span class="nv">$PATH</span>:/usr/local/texlive/2012/bin/i386-linux/ </code></pre></div> <p>That&#39;s it. So my <code>.profile</code> got these additional lines:</p> <div class="highlight"><pre><code class="text">if [ -d &quot;/usr/local/texlive/2012/bin/i386-linux&quot; ] ; then PATH=&quot;/usr/local/texlive/2012/bin/i386-linux:$`PATH&quot; fi if [ -d &quot;/usr/local/texlive/2012/texmf/doc/man&quot; ] ; then MANPATH=&quot;/usr/local/texlive/2012/texmf/doc/man:`$MANPATH&quot; fi if [ -d &quot;/usr/local/texlive/2012/texmf/doc/info&quot; ] ; then INFOPATH=&quot;/usr/local/texlive/2012/texmf/doc/info:$`INFOPATH&quot; fi </code></pre></div> <p>edit: I&#39;ve just installed TeX-Live 2012 and had to do this:</p> <div class="highlight"><pre><code class="bash">moose@pc07:/usr/bin<span class="sb">`</span><span class="nv">$ </span>rm latex moose@pc07:/usr/bin<span class="nv">$`</span> sudo ln -s /usr/local/texlive/2012/bin/i386-linux/pdflatex latex </code></pre></div> <p>You can try if your installation works by <code>latex --version</code>:</p> <div class="highlight"><pre><code class="text">pdfTeX 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0 Copyright 2009 Peter Breitenlohner (eTeX)/Han The Thanh (pdfTeX). There is NO warranty. Redistribution of this software is covered by the terms of both the pdfTeX copyright and the Lesser GNU General Public License. For more information about these matters, see the file named COPYING and the pdfTeX source. Primary author of pdfTeX: Peter Breitenlohner (eTeX)/Han The Thanh (pdfTeX). Compiled with libpng 1.2.42; using libpng 1.2.42 Compiled with zlib 1.2.3.3; using zlib 1.2.3.3 Compiled with poppler version 0.12.4 </code></pre></div> <p>If an old version is shown, you might want to see where it is located:</p> <div class="highlight"><pre><code class="bash">which latex </code></pre></div> <h2>Update</h2> <div class="highlight"><pre><code class="bash"><span class="nb">cd</span> /usr/local/texlive/2012/bin/i386-linux sudo ./tlmgr update --self sudo ./tlmgr update --all </code></pre></div> <h2>See also</h2> <ul> <li>Wikipedia: <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a>, <a href="http://en.wikipedia.org/wiki/TeX_Live">TeX Live</a></li> <li>Wikibooks: <a href="http://en.wikibooks.org/wiki/LaTeX">LaTeX</a>, <a href="http://de.wikibooks.org/wiki/LaTeX-Kompendium">LaTeX-Kompendium</a> (German)</li> <li>UbuntuUsers (German): <a href="http://wiki.ubuntuusers.de/LaTeX">LaTeX</a></li> </ul> Incredible Optical Illusions http://martin-thoma.com/incredible-optical-illusions Tue, 27 Mar 2012 10:05:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/incredible-optical-illusions <p>Some really great and short examples of illusions. If you want an explanation of them, I have added a link to the corresponding Wikipedia article.</p> <h2>Checker shadow illusion</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/checker-shadow-illusion-300x232.png"><img src="../images/2012/03/checker-shadow-illusion-300x232.png" alt="" width="300" height="232" class="size-medium wp-image-20311"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Checker_shadow_illusion">Checker shadow illusion</a>: The pieces A and B are of the same color.</p> <h2>Ebbinghaus illusion</h2> <div style="width: 240px" class="wp-caption aligncenter"><a href="../images/2012/03/eigenhaus-illusion.png"><img src="../images/2012/03/eigenhaus-illusion.png" alt="" width="240" height="148" class="size-full wp-image-20261"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Ebbinghaus_illusion">Ebbinghaus illusion</a>: the first central circle seems to be smaller than the second central circle although they are of identical size.</p> <p>The <a href="http://en.wikipedia.org/wiki/M%C3%BCller-Lyer_illusion">M&uuml;ller-Lyer illusion</a> is simmilar.</p> <h2>Fraser spiral illusion</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/03/fraser-spiral-illusion.png"><img src="../images/2012/03/fraser-spiral-illusion.png" alt="" width="512" height="514" class="size-full wp-image-20201"/></a><p class="wp-caption-text"></p></div> <p>Although you think you see a spiral, there are only concentric circles. This illusion is knowen as <a href="http://en.wikipedia.org/wiki/Fraser_spiral_illusion">Fraser spiral illusion</a>.</p> <h2>Grid illiusion</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2012/03/grid-illusion.png"><img src="../images/2012/03/grid-illusion.png" alt="" width="320" height="320" class="size-full wp-image-20221"/></a><p class="wp-caption-text"></p></div> <p>Dark dots seem to appear and disappear in the <a href="http://en.wikipedia.org/wiki/Grid_illusion">Grid illusion</a>.</p> <h2>Jastow illusion</h2> <div style="width: 333px" class="wp-caption aligncenter"><a href="../images/2012/03/jastow-illusion.png"><img src="../images/2012/03/jastow-illusion.png" alt="" width="333" height="209" class="size-full wp-image-20231"/></a><p class="wp-caption-text"></p></div> <p>In <a href="http://en.wikipedia.org/wiki/Jastrow_illusion">Jastow illusion</a>, the two figures are identical, although the lower one appears to be larger.</p> <h2>Z&ouml;llner illusion</h2> <div style="width: 225px" class="wp-caption aligncenter"><a href="../images/2012/03/zollner-illusion.png"><img src="../images/2012/03/zollner-illusion.png" alt="" width="225" height="159" class="size-full wp-image-20241"/></a><p class="wp-caption-text"></p></div> <p>In the figure of <a href="http://en.wikipedia.org/wiki/Z%C3%B6llner_illusion">Z&ouml;llner illusion</a> the black lines seem to be unparallel, but in reality they are parallel.</p> <h2>Hering illusion</h2> <div style="width: 125px" class="wp-caption aligncenter"><a href="../images/2012/03/hering-illusion.png"><img src="../images/2012/03/hering-illusion.png" alt="" width="125" height="200" class="size-full wp-image-20251"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Hering_illusion">Hering illusion</a>: Two straight and parallel lines look as if they were bowed outwards.</p> <h2>Spinning Dancer</h2> <p>This image is the only animated one in this post. <div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2012/03/spinning-dancer.gif"><img src="../images/2012/03/spinning-dancer.gif" alt="" width="150" height="200" class="size-full wp-image-20281"/></a><p class="wp-caption-text"></p></div> <a href="http://en.wikipedia.org/wiki/Spinning_Dancer">Spinning Dancer</a>: If the foot touching the ground is perceived to be the left foot, the dancer appears to be spinning clockwise (if seen from above); if it is taken to be the right foot, then she appears to be spinning counterclockwise.</p> <h2>Illusory motion</h2> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/03/motion-illusion.png"><img src="../images/2012/03/motion-illusion.png" alt="" width="512" height="257" class="size-full wp-image-20291"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Illusory_motion">Illusory motion</a>: This image is not animated!</p> <h2>Caf&eacute; wall illusion</h2> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2012/03/cafe-wall-illusion.png"><img src="../images/2012/03/cafe-wall-illusion.png" alt="" width="400" height="257" class="size-full wp-image-20351"/></a><p class="wp-caption-text"></p></div> <p><a href="http://en.wikipedia.org/wiki/Caf%C3%A9_wall_illusion">Caf&eacute; wall illusion</a>: the parallel straight dividing lines between staggered rows with alternating black and white &quot;bricks&quot; appear to be sloped</p> Learn how to type http://martin-thoma.com/learn-how-to-type Mon, 26 Mar 2012 15:40:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/learn-how-to-type <div style="width: 476px" class="wp-caption aligncenter"><a href="../images/2012/03/keybr.png"><img src="../images/2012/03/keybr.png" alt="" width="476" height="246" class=" wp-image-19691 "/></a><p class="wp-caption-text"></p></div> <p><a href="http://keybr.com/">keybr.com</a> is another service that helps you to learn how to type.</p> Eigenschaften von Abbildungsmatrizen http://martin-thoma.com/eigenschaften-von-abbildungsmatrizen Mon, 26 Mar 2012 15:30:44 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/eigenschaften-von-abbildungsmatrizen <p>Eine Abbildungsmatrix beschreibt eine lineare Abbildungs zwischen zwei endlichdimensionalen Vektorr&auml;umen. Sie ist abh&auml;ngig von der Basis des Urraums und des Zielraumes. <h2>Formale Definition</h2> <div class="definition">Eine <strong>Lineare Abbildung</strong> <code>$\Phi$</code> muss folgende Eigenschaften erf&uuml;llen: <ul> <li><code>$\Phi: V \rightarrow W$</code> ist eine Abbildung</li> <li><code>$\forall x, y \in W : \Phi(x+y) = \Phi(x) + \Phi(y)$</code></li> <li><code>$\forall x \in W : \forall a \in \mathbb{K}: \Phi(a \cdot x) = a \cdot \Phi(x)$</code></li> </ul> </div> Sei V ein n-dimensionaler <code>$\mathbb{K}$</code>-Vektorraum mit der Basis <code>$B = \{b_1, b_2, ..., b_n\}$</code> und W ein m-dimensonaler <code>$\mathbb{K}$</code>-Vektorraum mit der Basis <code>$C = \{c_1, c_2, ..., c_m\}$</code>. <div class="definition"></p> <p>Sei <code>$\Phi:V \rightarrow W$</code> eine lineare Abbildung.</p> <p>Dann ordnen wir der linearen Abbildung <code>$\Phi$</code> in folgender Weise eine Matrix A zu: <code>$\Phi (b_k) = \sum_{i=1}^{m} a_{ik}c_i, ~~ k = 1, ..., n, ~~ a_{ik}\in \mathbb{K}$</code></p> <p>Dann gilt: <code>$\Phi(x) = A \cdot x ~~~\text{ mit } x \in V$</code></p> <p>Diese Matrix A nennt man <strong>Abbildungsmatrix</strong>.</p> <p></div> <h2>Beispiele</h2> Sei <code>$\Phi: \mathbb{R}^4 \rightarrow \mathbb{R}^3$</code>. <h3>Nullzeile</h3> <code>$A_1 = \left . \underbrace{\begin{pmatrix} 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\1 &amp;amp; 2 &amp;amp; 3 &amp;amp; 4 \\5 &amp;amp; 6 &amp;amp; 7 &amp;amp; 8 \end{pmatrix}}_\text{dim V} \right \} \text{dim W}$</code> <h4>Standardbasis</h4> Sei <code>$B_S = (\begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix})$</code> und <code>$C_S = (\begin{pmatrix} 1 \\ 0 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix})$</code> Also sind B und C die geordnete Standardbasis des <code>$\mathbb{R}^4$</code> bzw. des <code>$\mathbb{R}^3$</code>.</p> <p>Was macht nun eine Abbildung <code>$\Phi$</code> mit der Matrix <code>$A_1$</code>?</p> <p>Ich denke ist ist leicht ersichtlich, dass bei einer Abbildungsmatrix dieser Form die erste Komponente des Bildvektors immer 0 ist.</p> <p><code>$\Phi_1(\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}) = \begin{pmatrix} 0 \\ 30 \\ 70 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B0%2C0%2C0%2C0%7D%2C%7B1%2C2%2C3%2C4%7D%2C%7B5%2C6%2C7%2C8%7D%7D.%7B%7B1%7D%2C%7B2%7D%2C%7B3%7D%2C%7B4%7D%7D">Wolfram|Alpha</a>) <code>$\Phi_1(\begin{pmatrix} 5 \\ -2 \\ 7 \\ -1 \end{pmatrix}) = \begin{pmatrix} 0 \\ 18 \\ 54 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B0%2C0%2C0%2C0%7D%2C%7B1%2C2%2C3%2C4%7D%2C%7B5%2C6%2C7%2C8%7D%7D.%7B%7B5%7D%2C%7B-2%7D%2C%7B7%7D%2C%7B-1%7D%7D">Wolfram|Alpha</a>) <h4>Andere Basis</h4> Sei <code>$B_1 = (\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}, \begin{pmatrix} 1 \\ 3 \\ 3 \\ 7 \end{pmatrix}, \begin{pmatrix} 3 \\ 1 \\ 4 \\ 1 \end{pmatrix}, \begin{pmatrix} 2 \\ 7 \\ 1 \\ 8 \end{pmatrix})$</code> und <code>$C_1 = (\begin{pmatrix} 2 \\ 3 \\ 5 \end{pmatrix}, \begin{pmatrix} 3 \\ 5 \\ 7 \end{pmatrix}, \begin{pmatrix} 5 \\ 7 \\ 11 \end{pmatrix})$</code></p> <p>Auch hier schauen wir uns wieder die Abbildung <code>$\Phi$</code> mit der Abbildungsmatrix <code>$A_1$</code> an.</p> <p><code>$\Phi_1(\underbrace{\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}}_\text{in Basis C}) = A_1 \cdot \begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix} = \underbrace{\begin{pmatrix} 0 \\ 30 \\ 70 \end{pmatrix}}_\text{in Basis B}$</code></p> <p>Auch hier ist also die erste Komponente jedes Bildvektors 0. Allerdings haben die Bildvektoren nun eine andere Basis. Sie werden sozusagen anders interpretiert. <h3>Nullspalte</h3> <code>$A_2 = \begin{pmatrix} 0 &amp;amp; 1 &amp;amp; 2 &amp;amp; 3 \\0 &amp;amp; 4 &amp;amp; 5 &amp;amp; 6 \\0 &amp;amp; 7 &amp;amp; 8 &amp;amp; 9 \end{pmatrix}$</code></p> <p>Nun mal wieder zwei Beispiel-Abbildungen: <code>$\Phi_2(\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}) = \begin{pmatrix} 20 \\ 47 \\ 74 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B0%2C1%2C2%2C3%7D%2C%7B0%2C4%2C5%2C6%7D%2C%7B0%2C7%2C8%2C9%7D%7D.%7B%7B1%7D%2C%7B2%7D%2C%7B3%7D%2C%7B4%7D%7D">Wolfram|Alpha</a>) <code>$\Phi_2(\begin{pmatrix} 100 \\ 2 \\ 3 \\ 7 \end{pmatrix}) = \begin{pmatrix} 20 \\ 47 \\ 74 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B0%2C1%2C2%2C3%7D%2C%7B0%2C4%2C5%2C6%7D%2C%7B0%2C7%2C8%2C9%7D%7D.%7B%7B100%7D%2C%7B2%7D%2C%7B3%7D%2C%7B4%7D%7D">Wolfram|Alpha</a>)</p> <p>Wenn die Abbildungsmatrix eine Nullspalte hat, ist es egal was der abzubildende Vektor als Eintrag an dieser Stelle hat. <h2>Basiswechsel bei Abbildungen</h2> Ich habe ja gerade veranschaulicht, dass bei einem Basiswechsel zwar die Abbildung gleich bleibt, es aber dennoch unterschiedliche Vektoren sind. Sie m&uuml;ssen halt unterschiedlich interpretiert werden.</p> <p>Nun k&ouml;nnte man die Abbildung, also insbesondere die Matrix, so &auml;ndern, dass die Vektoren, die man als &quot;gleich&quot; interpretieren w&uuml;rde, gleich abgebildet werden.</p> <p>Wir suchen also eine neue Abbildungsmatrix <code>$A_1&#39;$</code>, die die gleiche Abbildung beschreibt wie <code>$A_1$</code> mit den Standardbasen, nur von <code>$B_1$</code> nach <code>$C_1$</code>.</p> <p>Wenn man das machen will, kann man sich den Vorgang wie eine Ansammlung von Funktionen (im Sinne der Informatik) betrachten. Wir haben eine Funktion, die die Abbildung von der Standardbasis in die Standardbasis beschreibt. Als Input bekommen wir einen Vektor in der Basis <code>$B_1$</code> und herauskommen soll ein Vektor in der Basis <code>$C_1$</code>. Wir m&uuml;ssen also den Input-Vektor von der Basis <code>$B_1$</code> in die Standardbasis umwandeln und den Output-Vektor der gegebenen Funktion von der Standardbasis in die Basis <code>$C_1$</code> konvertieren.</p> <p>Dazu bestimmen wir zuerst die Basiswechselmatrix <code>$T_S^{B1}$</code> von der Basis <code>$B_1$</code> in die Standardbasis. Das ist genau die Basis selbst: <code> $$T_{B1}^S = \begin{pmatrix} 1 &amp; 1 &amp; 3 &amp; 2 \\ 2 &amp; 3 &amp; 1 &amp; 7 \\ 3 &amp; 3 &amp; 4 &amp; 1 \\ 4 &amp; 7 &amp; 1 &amp; 8 \end{pmatrix}$$</code> (siehe alten <a title="Wie bestimme ich die Basiswechselmatrix?" href="../wie-bestimme-ich-die-basiswechselmatrix/">Blogpost</a>)</p> <p>Und die Basiswechselmatrix <code>$T_S^{C1}$</code> von der Standardbasis in die Basis <code>$C_1$</code>. Das ist das Inverse der Basis <code>$C_1$</code>:</p> <p><code> $$ T_S^{C1} = \frac{1}{2} \cdot \begin{pmatrix} -6 &amp; -2 &amp; 4 \\ -2 &amp; 3 &amp; -1 \\ 4 &amp; -1 &amp; -1 \end{pmatrix} $$</code></p> <p>Insgesamt sieht das dann so aus: <code>$T_S^{C1} \cdot (A_1 \cdot (T_{B1} \cdot x))$</code>. Da f&uuml;r die Matrixmultiplikation das <a href="http://de.wikipedia.org/wiki/Assoziativgesetz">Assoziativgesetz</a> gilt, kann man das vereinfachen:</p> <p><code> $$ A_1′ = T_S^{C1} \cdot A_1 \cdot T_{B1}^S = \begin{pmatrix} 110 &amp; 156 &amp; 93 &amp; 195 \\ 10 &amp; 16 &amp; 3 &amp; 15 \\ -50 &amp; -72 &amp; -39 &amp; -87 \end{pmatrix} $$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B-3%2C+-1%2C+2%7D%2C+%7B-1%2C+3%2F2%2C+-1%2F2%7D%2C+%7B2%2C+-1%2F2%2C+-1%2F2%7D%7D+*+%7B%7B0%2C0%2C0%2C0%7D%2C%7B1%2C2%2C3%2C4%7D%2C%7B5%2C6%2C7%2C8%7D%7D+*+%7B%7B1%2C1%2C3%2C2%7D%2C%7B2%2C3%2C1%2C7%7D%2C%7B3%2C3%2C4%2C1%7D%2C%7B4%2C7%2C1%2C8%7D%7D">Wolfram|Alpha</a>)</p> <p>Ein Test ob es stimmen kann: z.B. sind <code>$\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}_S = 1 \cdot \begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix} + 0 \cdot \begin{pmatrix} 1 \\ 3 \\ 3 \\ 7 \end{pmatrix} + 0 \cdot \begin{pmatrix} 3 \\ 1 \\ 4 \\ 1 \end{pmatrix} + 0 \cdot \begin{pmatrix} 2 \\ 7 \\ 1 \\ 8 \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}_{B_1} $</code> und <code>$\begin{pmatrix} 0 \\ 30 \\ 70 \end{pmatrix}_S = 110 \cdot \begin{pmatrix} 2 \\ 3 \\ 5 \end{pmatrix} + 10 \cdot \begin{pmatrix} 3 \\ 5 \\ 7 \end{pmatrix} -50 \cdot \begin{pmatrix} 5 \\ 7 \\ 11 \end{pmatrix} = \begin{pmatrix} 110 \\ 10 \\ -50 \end{pmatrix}_{C_1}$</code></p> <p><code>$\begin{pmatrix} 110 &amp;amp; 156 &amp;amp; 93 &amp;amp; 195 \\ 10 &amp;amp; 16 &amp;amp; 3 &amp;amp; 15 \\ -50 &amp;amp; -72 &amp;amp; -39 &amp;amp; -87 \end{pmatrix} \cdot \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}_{B_1} = \begin{pmatrix} 110 \\ 10 \\ -50 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=%7B%7B110%2C+156%2C+93%2C+195%7D%2C+%7B10%2C+16%2C+3%2C+15%7D%2C+%7B-50%2C+-72%2C+-39%2C+-87%7D%7D+*+%7B%7B1%7D%2C%7B0%7D%2C%7B0%7D%2C%7B0%7D%7D">Wolfram|Alpha</a>)</p> <p>Ich habe keine Ahnung, wie man nur mit den Basen B und C und der Abbildungsmatrix <code>$A_1&#39;$</code> wieder auf die Abbildungsmatrix <code>$A_1$</code> kommt. Ich habe auf <a title="How can I determinate the bases for the most simple representation of a linear transformation?" href="http://math.stackexchange.com/q/123495/6876">Stackexchange</a> mal nachgefragt, aber das ist nicht von Erfolg gekr&ouml;nt gewesen. <h2>Anzahl der Abbildungsmatrizen</h2> F&uuml;r jede lineare Abbildungen <code>$\Phi: V \rightarrow W$</code> (wobei V und W <strong>endliche</strong> Vektorr&auml;ume sind) gibt es eine Abbildungsmatrix.</p> <p>Wie sieht dann die Abbildungsmatrix folgender Abbildung aus? <blockquote>Sei <code>$V:= \{p \in \mathbb{R}[t] | deg(t) \leq 5 \}$</code> der Vektorraum aller Polynome in t mit reellen Koeffizienten und Grad <code>$ \leq 5$</code>. Sei <code>$F: V \rightarrow V$</code> die Shift-Abbildung <code>$(Fp)(t) = p(t+1)$</code> <p class="quote-source">(Quelle: <a href="http://matheraum.de/forum/Shift-Abbildung/t463098">Matheraum.de</a>)</p> </blockquote></p> <p>Wenn V allerdings der <code>$\mathbb{Z}/ 2 \mathbb{Z}$</code> und W der <code>$\mathbb{Z}/ 3 \mathbb{Z}$</code> &uuml;ber jeweils den K&ouml;rper <code>$\mathbb{Z}/ 2 \mathbb{Z}$</code> sind, dann ist die Abbildungsmatrix eine 1x1 Matrix. Das eine Element dieser 1x1 Matrix kann zwei verschiedene Werte - 0 und 1 - annehmen. Selbst wenn W der <code>$\mathbb{Z}/ 41 \mathbb{Z}$</code> w&auml;re, w&uuml;rde es nur zwei verschiedene Abbildungen geben.</p> <p>Wenn V der <code>$\mathbb{Z}/ 3 \mathbb{Z}$</code> und W der <code>$\mathbb{Z}/ 2 \mathbb{Z}$</code> ist, dann gibt es nur eine lineare Abbildung <code>$\Phi: V \rightarrow W$</code>(die Nullabbildung). Die Abbildungsmatrix <code>$\begin{pmatrix}1\end{pmatrix}$</code> bezeichnet keine lineare Abbildung <code>$\Phi$</code>, da 2 in V ist, aber nicht in W.</p> <p>Es scheint also so zu sein, dass man im Allgemeinen nichts &uuml;ber die Anzahl der linearen Abbildungen sagen kann. <h2>Dies und das</h2> Zwei lineare Abbildungen k&ouml;nnen hintereinander ausgef&uuml;hrt werden, indem ihre Matrizen multipliziert werden: <code>$\Phi_1 : V \rightarrow W, \Phi_1(x) := A_1 \cdot x$</code> <code>$\Phi_2 : W \rightarrow X, \Phi_2(x) := A_2 \cdot x$</code> <code>$\Phi_2 \circ \Phi_1 : V \rightarrow X, x \mapsto \Phi_2 \circ \Phi_1(x) := \Phi_2(\Phi_1(x)) = A_2 \cdot (A_1 \cdot x) = (A_2 \cdot A_1) \cdot x$</code></p> <p>Der Rang der Abbildungsmatrix entspricht der Dimension des Bildes der Abbildung. <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Vektorraum">Vektorraum</a>, <a href="http://de.wikipedia.org/wiki/Abbildungsmatrix">Abbildungsmatrix</a>, <a href="http://de.wikipedia.org/wiki/Rang_(Mathematik)">Rang</a></li> <li><a title="Wie bestimme ich die Basiswechselmatrix?" href="../wie-bestimme-ich-die-basiswechselmatrix/">Wie bestimme ich die Basiswechselmatrix?</a></li> <li>Skript von Prof. Dr. Leunzinger, ab S. 101 (im passwortgesch&uuml;tzten <a href="https://studium.kit.edu/sites/vab/0x869D2B3648EA0D498D68FE4A6098E555/Vorlesungsunterlagen/Forms/AllItems.aspx">VAB</a>)</li> </ul></p> Wie bestimme ich das Inverse einer Matrix? http://martin-thoma.com/wie-bestimme-ich-das-inverse-einer-matrix Tue, 20 Mar 2012 15:07:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-bestimme-ich-das-inverse-einer-matrix <p>Nicht alle Matrizen sind invertierbar. Matrizen, die invertierbar sind, nennt man auch regul&auml;r. Die Menge aller invertierbaren <code>$n \times n$</code>&ndash;Matrizen &uuml;ber einem Grundk&ouml;rper (oder Grundring) K bildet eine Gruppe bez&uuml;glich der Matrixmultiplikation, die allgemeine lineare Gruppe <code>$GL_n(K)$</code>.</p> <p>Das Inverse einer Matrix A wird berechnet, indem eine Matrix (A|E) gebildet wird und mit dem Gau&szlig;schem Eliminationsverfahren in <code>$(E | A^{-1})$</code> aufgel&ouml;st wird.</p> <h2>Beispiel</h2> <h3>Ein Inverses existiert</h3> <p><code>$\left( \begin{array}{c c c c | c c c c} 4 &amp; 2 &amp; 4 &amp; 2 &amp; 1 &amp; 0 &amp; 0 &amp; 0 \\ 3 &amp; 1 &amp; 4 &amp; 1 &amp; 0 &amp; 1 &amp; 0 &amp; 0\\ 2 &amp; 7 &amp; 1 &amp; 8 &amp; 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 1 &amp; 1 &amp; 2 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c | c c c c} 2 &amp; 1 &amp; 2 &amp; 1 &amp; \frac{1}{2} &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; -\frac{1}{2} &amp; 1 &amp; -\frac{1}{2} &amp; -\frac{3}{4} &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 6 &amp; -1 &amp; 7 &amp; -\frac{1}{2} &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 1 &amp; 1 &amp; 2 &amp; 0 &amp; 0 &amp; 0 &amp; 1 \end{array} \right)$</code></p> <p><code>$\rightsquigarrow^* \frac{1}{8} \begin{pmatrix} 12 &amp; -12 &amp; -2 &amp; 2 \\ -16 &amp; 18 &amp; 5 &amp; -13 \\ -8 &amp; 10 &amp; 1 &amp; -1 \\ 12 &amp; -14 &amp; -3 &amp; 11 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=Inverse%5B%7B%7B4%2C2%2C4%2C2%7D%2C%7B3%2C1%2C4%2C1%7D%2C%7B2%2C7%2C1%2C8%7D%2C%7B0%2C1%2C1%2C2%7D%7D%5D">Wolfram|Alpha</a>)</p> <h3>Kein Inverses existiert</h3> <p>Matrizen, zu denen kein Inverses existiert, werden singul&auml;r genannt. Das ist ein Beispiel: <code>$\begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 1 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 1 &amp; 0 \\ 0 &amp; 0 &amp; 1 &amp; 0 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=Inverse%5B%7B%7B1%2C0%2C0%2C0%7D%2C%7B0%2C1%2C0%2C0%7D%2C%7B0%2C0%2C1%2C0%7D%2C%7B0%2C0%2C1%2C0%7D%7D%5D">Wolfram|Alpha</a>) Sobald also erkennbar ist, dass beim Eliminationsverfahren eine Nullzeile auftritt, kann man abbrechen.</p> <p>Matrizen, die nicht quadratisch sind, haben kein Inverses: <code>$\begin{pmatrix} 1 &amp; 0 &amp; 0 \\ 0 &amp; 1 &amp; 0 \\ 0 &amp; 0 &amp; 1 \\ 0 &amp; 0 &amp; 2 \end{pmatrix}$</code> (siehe <a href="http://www.wolframalpha.com/input/?i=Inverse%5B%7B%7B1%2C0%2C0%7D%2C%7B0%2C1%2C0%7D%2C%7B0%2C0%2C1%7D%2C%7B0%2C0%2C2%7D%7D%5D">Wolfram|Alpha</a>)</p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Regul%C3%A4re_Matrix">Regul&auml;re Matrix</a>, <a href="http://de.wikipedia.org/wiki/Gau%C3%9Fsches_Eliminationsverfahren">Gau&szlig;sches Eliminationsverfahren</a></li> <li>Skript von Prof. Dr. Leuzinger, ab S. 53</li> </ul> Wie bestimme ich die Basiswechselmatrix? http://martin-thoma.com/wie-bestimme-ich-die-basiswechselmatrix Fri, 16 Mar 2012 16:06:11 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-bestimme-ich-die-basiswechselmatrix <p>Eine Basiswechselmatrix oder auch &Uuml;bergangsmatrix dient dem Basiswechsel.</p> <p>Angenommen man hat zwei Basen des <code>$\mathbb{R}^2$</code>-Vektorraumes: <code>$B = \{\overbrace{\begin{pmatrix} 1 \\ 2 \end{pmatrix}}^{b_1}, \overbrace{\begin{pmatrix} 2 \\ 3 \end{pmatrix}}^{b_2} \}$</code> und <code>$\bar B = \{\underbrace{\begin{pmatrix} 3 \\ 5 \end{pmatrix}}_{\bar b_1}, \underbrace{\begin{pmatrix} 8 \\ 13 \end{pmatrix}}_{\bar b_2} \}$</code></p> <p>Sei nun <code>$v := \begin{pmatrix} 1 \\ 1 \end{pmatrix}$</code> ein Vektor zur Standardbasis. Da <code>$B$</code> und <code>$\bar B$</code> auch Basen des <code>$\mathbb{R}^2$</code> sind, kann man v auch zu diesen Basen darstellen: <code>$\Theta_{B}(v) = \begin{pmatrix} -1 \\ 1 \end{pmatrix}$</code> und <code>$\Theta_{\bar B}(v) = \begin{pmatrix} -5 \\ 2 \end{pmatrix}$</code></p> <p>Wie kann man nun diese neue Darstellung berechnen? Nun, wir bestimmen eine Matrix A f&uuml;r die gilt: <code>$A \cdot \Theta_B(v) = \Theta_{\bar B}(v) ~~~ \forall v \in \mathbb{R}^2$</code>. Diese Matrix findet man, indem man beide geordneten Basen nebeneinander schreibt und die rechte Seite &quot;durchgau&szlig;t&quot;: <code>$\left( \begin{array}{c c | c c} 1 &amp; 2 &amp; 3 &amp; 8 \\ 2 &amp; 3 &amp; 5 &amp; 13 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c | c c} \frac{1}{3} &amp; \frac{2}{3} &amp; 1 &amp; \frac{8}{3} \\ 2 &amp; 3 &amp; 5 &amp; 13 \end{array} \right) \rightsquigarrow \\ \left( \begin{array}{c c | c c} \frac{1}{3} &amp; \frac{2}{3} &amp; 1 &amp; \frac{8}{3} \\ \frac{6-5}{3} &amp; \frac{9-10}{3} &amp; 0 &amp; \frac{39-8 \cdot 5}{3} \end{array} \right) \rightsquigarrow \left( \begin{array}{c c | c c} \frac{1}{3} &amp; \frac{2}{3} &amp; 1 &amp; \frac{8}{3} \\ \frac{1}{3} &amp; -\frac{1}{3} &amp; 0 &amp; -\frac{1}{3} \end{array} \right) \rightsquigarrow \\ \left( \begin{array}{c c | c c} \frac{9}{3} &amp; -\frac{6}{3} &amp; 1 &amp; 0 \\ \frac{1}{3} &amp; -\frac{1}{3} &amp; 0 &amp; -\frac{1}{3} \end{array} \right) \rightsquigarrow \left( \begin{array}{c c | c c} 3 &amp; -2 &amp; 1 &amp; 0 \\ -1 &amp; 1 &amp; 0 &amp; 1 \end{array} \right)$</code></p> <p>Links steht die geordnete Basis B und rechts die geordnete Basis <code>$\bar B$</code>, also (von | nach) und rechts wendet man Gau&szlig; an.</p> <p>Nun noch die Kontrolle, ob es stimmen kann: <code>$\underbrace{\begin{pmatrix} 3 &amp; -2 \\ -1 &amp; 1 \end{pmatrix}}_{A_{B \bar B}} \cdot \underbrace{\begin{pmatrix} -1 \\ 1 \end{pmatrix}}_{\Theta_{B}(v)} = \underbrace{\begin{pmatrix} -5 \\ 2 \end{pmatrix}}_{\Theta_{\bar B}(v)}$</code></p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Basiswechsel_(Vektorraum)">Basiswechsel (Vektorraum)</a>, <a href="http://de.wikipedia.org/wiki/Standardbasis">Standardbasis</a></li> <li>Skript von Prof. Dr. Leuzinger, ab S. 82</li> </ul> Typography: Word as Image http://martin-thoma.com/typography-word-as-image Mon, 12 Mar 2012 13:06:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/typography-word-as-image <iframe width="512" height="290" src="http://www.youtube.com/embed/J59n8FsoRLE" frameborder="0" allowfullscreen></iframe> <p>Challenge: Create an image out of a word, using only the letters in the word itself.</p> <p>Rule: Use only the graphic elements of the letters without adding outside parts.</p> Computer Science Jokes http://martin-thoma.com/computer-science-jokes Sat, 10 Mar 2012 23:04:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/computer-science-jokes <div class="info">You have to read <a href="http://stackoverflow.com/q/234075/562769">What is your best programmer joke?</a>, <a href="http://stackoverflow.com/q/218123/562769">What was the strangest coding standard rule that you were forced to follow?</a> and <a href="http://stackoverflow.com/q/184618/562769">What is the best comment in source code you have ever encountered?</a></div> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/03/hello-world-cartoon.jpg"><img src="../images/2012/03/hello-world-cartoon.jpg" alt="" width="512" height="487" class=" wp-image-18071 "/></a><p class="wp-caption-text"></p></div> <p>Programming is like sex: One mistake and you have to support it for the rest of your life.</p> <div style="width: 484px" class="wp-caption aligncenter"><a href="../images/2012/03/write-500-words-count-cpp.jpg"><img src="../images/2012/03/write-500-words-count-cpp.jpg" alt="" width="484" height="162" class="size-full wp-image-18111"/></a><p class="wp-caption-text"></p></div> <p>What&rsquo;s the difference between drug dealers and computer programmers? <table> <tr> <th>Drug Dealers</th> <th>Computer Programmers</th> </tr> <tr> <td>Refer to their clients as &ldquo;users&rdquo;.</td> <td>Refer to their clients as &ldquo;users&rdquo;.</td> </tr> <tr> <td>&ldquo;The first one&rsquo;s free!&rdquo;</td> <td>&ldquo;Download a free trial version&hellip;&rdquo;</td> </tr> <tr> <td>Have important South-East Asian connections (to help move the stuff).</td> <td>Have important South-East Asian connections (to help debug the code).</td> </tr> <tr> <td>Strange jargon: &ldquo;Stick,&rdquo; &ldquo;Rock,&rdquo; &ldquo;Dime bag,&rdquo; &ldquo;E&rdquo;.</td> <td>Strange jargon: &ldquo;SCSI,&rdquo; &ldquo;RTFM,&rdquo; &ldquo;Java,&rdquo; &ldquo;ISDN&rdquo;.</td> </tr> <tr> <td>Realize that there&rsquo;s tons of cash in the 14- to 25-year-old market.</td> <td>Realize that there&rsquo;s tons of cash in the 14- to 25-year-old market.</td> </tr> <tr> <td>Job is assisted by the industry&rsquo;s producing newer, more potent mixes.</td> <td>Job is assisted by industry&rsquo;s producing newer, faster machines.</td> </tr> <tr> <td>Often seen in the company of pimps and hustlers.</td> <td>Often seen in the company of marketing people and venture capitalists.</td> </tr> <tr> <td>Their product causes unhealthy addictions.</td> <td>DOOM. Quake. FarmVille. CS. &lsquo;Nuff said.</td> </tr> <tr> <td>Do your job well, and you can sleep with sexy movie stars who depend on you.</td> <td>Damn! Damn! DAMN!!!</td> </tr> </table></p> <div style="width: 413px" class="wp-caption aligncenter"><a href="http://imgs.xkcd.com/comics/compiling.png"><img src="http://imgs.xkcd.com/comics/compiling.png" alt="" width="413" height="360" class=""/></a><p class="wp-caption-text"></p></div> <p>ME: You should really think about a new monitor. CLIENT: I would, but I don&rsquo;t want to lose my icons. (Source: Clients From Hell)</p> <div style="width: 282px" class="wp-caption aligncenter"><a href="../images/2012/03/computer-science-major-282x300.png"><img src="../images/2012/03/computer-science-major-282x300.png" alt="" width="282" height="300" class="size-medium"/></a><p class="wp-caption-text"></p></div> <p>There are 10 types of people: those who understand binary, and those who do not understand it.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/why-people-seem-to-have-freetime-300x248.png"><img src="../images/2012/03/why-people-seem-to-have-freetime-300x248.png" alt="" width="300" height="248" class="size-medium"/></a><p class="wp-caption-text"></p></div> <h2>More Jokes!</h2> <ul> <li><a href="http://bash.org/?random">Bash.org</a></li> <li><a href="http://bofh.ch/">Bastard Operator from Hell</a></li> <li><a href="http://clientsfromhell.net/">Clients From Hell</a></li> <li><a href="http://www.cs.cmu.edu/~eugene/quotes/prog.html">cs.cmu.edu</a></li> </ul> Abschlussaufgaben Programmieren http://martin-thoma.com/abschlussaufgaben-programmieren Sat, 10 Mar 2012 15:00:13 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/abschlussaufgaben-programmieren <p><strong>Hinweis</strong>: Dieser Blogpost ist vermutlich nur f&uuml;r Informatik-Studenten am KIT im WS 2011 / 2012 interessant!</p> <p>Hier ein paar Hinweise zu den Abschlussaufgaben aus dem Forum. Dabei habe ich die Antworten von jgraf, mmohr und praktomat genommen.</p> <h2>Allgemeines</h2> <ul> <li>Was wir absolut nicht sehen wollen sind grosse Methoden, die verstreut &uuml;ber den ganzen Code diverse returns enth&auml;lt. Eventuell sollte man diese Methode dann ohnehin in Hilfsmethoden aufteilen.</li> <li>Parameter: Die Anzahl der Parameter muss exakt stimmen. Sind zu &uuml;berz&auml;hlige Parameter vorhanden, muss ein Fehler ausgegeben werden.</li> <li>toString/equals: Sollte nur f&uuml;r Klassen geschrieben werden, bei denen es Sinn macht. Vor allem auf eins aufpassen: Wenn man equals &uuml;berschreibt, dann sollte man auch hashCode &uuml;berschreiben (siehe <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object">docs.oracle.com</a>) bzw, beliebige suche nach "equals hashCode"). Mir fallen spontan wenige F&auml;lle ein, wo es keinen Sinn macht, equals()/hashCode() oder toString() zu &uuml;berschreiben. Die Shell ist vielleicht so ein Fall, oder auch Utility-Klassen. </li> <li>Verbergt die tats&auml;chlichen Typen, woimmer es m&ouml;glich ist! Also z.B. <code>private Map meineMap = new HashMap<Integer, Blub>();</code></li> </ul> <blockquote>Frage: D&uuml;rfen Strings direkt im Programmcode stehen, oder sollten diese gesammelt am Beginn einer Klasse stehen?</blockquote> <p>Antwort: Kommt darauf an, wenn Sie mehr als eimal verwendet werden, dann sollte man Konstanten daraus machen.</p> <blockquote>Frage: Soll die Shell nur korrekte Werte an den eigentlichen LittlePraktomat &uuml;bergeben, also alle Fehlerquellen bereits in der Shell-Klasse abgefangen werden oder soll der LittlePraktomat Exceptions werfen, die in der Shell dann gefangen werden? Oder soll beides gemacht werden?</blockquote> <p>Antwort: Die &ouml;ffentlichen Methoden einer Klasse sind deren Schnittstelle. In den Javadoc Kommentaren sollte stehen, wie diese Schnittstelle zu verwenden ist. Also welcher Art die Eingaben sein m&uuml;ssen und wie die Ausgaben aussehen. Wenn sich ein Aufrufer nicht and diese Vereinbarung h&auml;lt, dann sollte die Methode der Schnittstelle eine Exception werfen (IllegalArgument, NullPointer, ...). Diese Exceptions sollten normalerweise nie vom Aufrufer gefangen werden. Sie sollen das Program kontrolliert zum Absturz bringen. Die Logik dahinter ist folgende: Wenn eine IllegalArgumentException (oder &auml;hnliches) fliegt, dann wurde eine Schnittstelle falsch verwendet. Der Aufrufer der Schnittstelle hat aber vor dem Aufruf sicher zu stellen, dass alle Forderungen der Schnittstelle eingehalten werden. D.h. wenn eine solche Exception auftritt liegt ein Programmierfehler vor. Mit Hilfe des Exceptionstacktrace kann der Entwickler diesen realtiv bequem finden und beheben.</p> <p>Es ist also beides zu machen, die Shell (der Aufrufer) hat vor dem Verwenden der Praktomat-Schnittstelle sicher zu stellen, dass alle Eingaben korrekt sind. Sind die Eingaben falsch, dann wird eine Fehlermeldung ausgegeben. Die Praktomat-Schnittstelle sch&uuml;tzt sich vor falscher Verwendung mit Hilfe von Exceptions.</p> <h2>Tests</h2> <p>Ihr <strong>m&uuml;sst</strong> eine Tests.txt mit abgeben. Die ist wie ein Beispiel aufgebaut und sollt wichtige Eingaben / Ausgaben enthalten, die eventuell zu Fehlern f&uuml;hren k&ouml;nnten.</p> <p>Da ihr sie ja sowieso schreibt, k&ouml;nnt ihr euer Programm auch auf eure Tests.txt &uuml;berpr&uuml;fen. Ich habe mir dazu folgendes kleines <a href='../images/2012/03/programmieren-abschlussaufgabe.zip'>Python-Script zum Vergleichen</a> gebastelt und vergleiche dann den normalisierten realen Output mit hilfe von <a href="http://wiki.ubuntuusers.de/Meld">Meld</a> mit dem erwartetem Output.</p> <p>Also folgendes in der Bash:</p> <div class="highlight"><pre><code class="bash">python checkTests.py meld ../tmp/createdOutputNormalized.txt ../tmp/compareTo.txt </code></pre></div> <p>Ihr m&uuml;sst halt noch die Pfade anpassen.</p> <h2>Abschlussaufgabe 1</h2> <p>Folgendes zum LittlePraktomat: <ul> <li>Falls die Namen von Personen etwas anderes als Kleinbuchstaben haben (also z.B. Gro&szlig;buchstaben!) soll ein Fehler ausgegeben werden. &auml;&ouml;&uuml; m&uuml;ssen nicht als Kleinbuchstaben erkannt werden, a-z reicht.</li> </ul></p> <h2>Abschlussaufgabe 2</h2> <p>Folgendes zu <a href="http://de.wikipedia.org/wiki/Othello_(Spiel)">Othello</a>: <ul> <li>Wer sehr schnell die Aufgabe erledigt hatte (also noch am ersten Tag), dem fehlen hier eventuell ein paar Sachen. Habt ihr den hole-Befehl? Falls ja, ist alles ok. Sonst solltet ihr nochmals rein schauen und eure L&ouml;sung nochmals hochladen, weil eine veraltete Aufgabenstellung zu beginn hochgeladen wurde.</li> <li>Eine g&uuml;ltige Spielfeldgr&ouml;&szlig;e MUSS gerade breite / h&ouml;he haben, gr&ouml;&szlig;er als 0x0 sein und kleiner gleich 26x98 sein.</li> <li>Ein g&uuml;ltiges Rechteck MUSS die erste Koordinate links oben und die zweite rechts unten haben!</li> </ul></p> <p>Es gibt folgende Befehle: <ul> <li>newGame <Breite> <H&ouml;he> [<Stellung>]</li> <li>hole <Rechteck></li> <li>move <Position></li> <li>print</li> <li>abort</li> <li>possibleMoves</li> <li>quit</li> </ul></p> <h2>Daten</h2> <p><strong>Abschlussaufgabe 1</strong>: 01.02.2012 - 12.03.2012 Funktionalit&auml;t: 0 - 7 Punkte Programmiermethodik: 0 - 7 Punkte Endnote = (2 &middot; Funktionalit&auml;t + Programmiermethodik)</p> <p><strong>Abschlussaufgabe 2</strong>: 13.02.2012 - 26.03.2012, 13:00 Uhr Funktionalit&auml;t: 0 - 7 Punkte Programmiermethodik: 0 - 7 Punkte Endnote = (2 &middot; Funktionalit&auml;t + Programmiermethodik)</p> <h2>Ergebnisse</h2> <p>Mir wird, wenn ich im Abschlussaufgaben-Praktomat auf &quot;Home&quot; klicke, bereits angezeigt, dass es anscheinend maximal 24 Punkte auf die &quot;Abschlu&szlig;aufgabe 1: Little Praktomat&quot; gibt. Bin ja mal gespannt, wann es Ergebnisse gibt.</p> <p>Es gab jeweils auf Funktionalit&auml;t und Programmiermethodik 14 Punkte, wobei die Punktzahl der Funktionalit&auml;t verdoppelt wurde. Damit kommen wir insgesamt auf 2 * (14*2 + 14)= 84 Punkte. Der Notenschl&uuml;ssel ist wie folgt:</p> <table> <tr><th>Bewertungspunkte</th><th>Gesamtnote</th></tr> <tr><td>82,0 - 84,0</td><td>1,0</td></tr> <tr><td>78,0 - 81,5</td><td>1,3</td></tr> <tr><td>74,0 - 77,5</td><td>1,7</td></tr> <tr><td>70,0 - 73,5</td><td>2,0</td></tr> <tr><td>66,0 - 69,5</td><td>2,3</td></tr> <tr><td>62,0 - 65,5</td><td>2,7</td></tr> <tr><td>58,0 - 61,5</td><td>3,0</td></tr> <tr><td>54,0 - 57,5</td><td>3,3</td></tr> <tr><td>50,0 - 53,5</td><td>3,7</td></tr> <tr><td>46,0 - 49,5</td><td>4,0</td></tr> <tr><td>0 - 45,5</td><td>5,0 - nicht bestanden</td></tr> </table> <h2>Meine Abgabe</h2> <ul> <li>LittlePraktomat: <a href="http://www.martin-thoma.de/programmieren-little-praktomat/class-diagram/class-diagram.pdf">Klassendiagramm</a> + <a href="http://www.martin-thoma.de/programmieren-little-praktomat/">JavaDoc</a> + <a href='../images/2012/03/little-praktomat.zip'>Java Source Code</a></li> <li>Othello: <a href="http://www.martin-thoma.de/programmieren-othello/">JavaDoc</a> + <a href='../images/2012/03/othello.zip'>Java Source Code</a></li> </ul> <h3>Fehlerquellen</h3> <p>Es wurde bem&auml;ngelt, dass ich wenig Kommentare hab. Ich finde, ich habe wahnsinnig viele ...</p> <h4>LittlePraktomat</h4> <p><strong>Test 4</strong>: Eingabe: list-solutions 99999999999999999999 Exception in thread &quot;main&quot; java.lang.NumberFormatException - die Zahl ist zu gro&szlig; <strong>Test 7</strong>: Aus Bl&ouml;dheit nicht bestanden ... ich habe eine Funktion (das wechseln von Tutoren) nicht &uuml;berpr&uuml;ft.</p> <h4>Othello</h4> <p><strong>Test 6 b</strong>: Direkt nach dem Start des Programms &quot;hole A1:A1&quot; hat eine (meiner eigenen) Exceptions geworfen ... bzw. mit korrekter Angabe, wo der Fehler liegt ... also auch Dummheit <em>argh</em></p> How to fill holes in your wall / ceiling http://martin-thoma.com/how-to-fill-holes-in-your-wall-ceiling Mon, 05 Mar 2012 21:08:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-fill-holes-in-your-wall-ceiling <div style="width: 128px" class="wp-caption alignright"><a href="../images/2011/10/do-it-yourself-thumb.jpg"><img src="../images/2011/10/do-it-yourself-thumb.jpg" alt="" width="128" height="128" class="size-full wp-image-4861 "/></a><p class="wp-caption-text"></p></div> <p>I&#39;ve decided to fill some holes in my ceiling and my wall today. I don&#39;t want to paint my room the next time as it is too cold at the moment, but the holes were really ugly. I&#39;ve added a photo of them. So I went to the next hardware store and asked what could be done. I thought I needed to use gypsum which is grey, so it wouldn&#39;t look very good. Additionally you can buy gypsum only in 1.5 kg bags. <br/> <br/> <br/> <h2>Situation before</h2> <div style="width: 614px" class="wp-caption aligncenter"><a href="../images/2012/03/loch-in-der-decke-1024x563.jpg"><img src="../images/2012/03/loch-in-der-decke-1024x563.jpg" alt="" width="614" height="338" class=" wp-image-17171 "/></a><p class="wp-caption-text"></p></div></p> <h2>The tools</h2> <p>The guy at the hardware store suggested to use acrylic paint. So I did. These were the tools I needed: <ul> <li><a href="http://en.wikipedia.org/wiki/Acrylic_paint">Acrylic paint</a>: about 4.00 Euro</li> <li>some <a href="http://en.wikipedia.org/wiki/Masking_tape">masking tape</a></li> <li>a <a href="http://en.wikipedia.org/wiki/Putty_knife">putty knife</a></li> </ul></p> <table> <tr> <td><div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2012/03/kreppband-japanspachtel-150x150.jpg"><img src="../images/2012/03/kreppband-japanspachtel-150x150.jpg" alt="" width="150" height="150" class="size-thumbnail wp-image-17231"/></a><p class="wp-caption-text"></p></div></td> <td><div style="width: 150px" class="wp-caption aligncenter"><a href="../images/2012/03/maler-acryl-150x150.jpg"><img src="../images/2012/03/maler-acryl-150x150.jpg" alt="" width="150" height="150" class="size-thumbnail wp-image-17241"/></a><p class="wp-caption-text"></p></div></td> </tr> </table> <h2>One special problem</h2> <p>As I had a wall plug in my ceiling I needed to remove it before I could start. I could not simply push it into the wall (it didn&#39;t work, I&#39;ve tried it). And removing this special wall plug isn&#39;t that easy. This is how it looks like in the wall:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/hohlraumduebel-zusammen-300x300.jpg"><img src="../images/2012/03/hohlraumduebel-zusammen-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-17281"/></a><p class="wp-caption-text"></p></div> <p>So I tried to stretch it:</p> <div style="width: 220px" class="wp-caption aligncenter"><a href="../images/2012/03/hohlraumduebel-hammer-220x300.jpg"><img src="../images/2012/03/hohlraumduebel-hammer-220x300.jpg" alt="" width="220" height="300" class="size-medium wp-image-17301"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/hohlraumduebel-zange-300x300.jpg"><img src="../images/2012/03/hohlraumduebel-zange-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-17311"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/hohlraumduebel-auseinander-300x300.jpg"><img src="../images/2012/03/hohlraumduebel-auseinander-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-17341"/></a><p class="wp-caption-text"></p></div> <h2>Filling the hole</h2> <p>First you need to clean both holes so that the acrylic paint can stick. Then you have to use the masking tape to get a clean border:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/loch-abkleben-300x300.jpg"><img src="../images/2012/03/loch-abkleben-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-17271"/></a><p class="wp-caption-text"></p></div> <p>You have to use the putty knife to get a clean, smooth surface with the acrylic paint. Maybe you need to fill the hole repeatedly with acrylic paint. As soon as the surface looks okay, you can stop. Now remove the masking tape and then wait some hours until the acrylic paint is dry. The time you have to wait depends on the acrylic paint you use, but mine is dry enough for painting after 4 - 6 hours.</p> <h2>Situation afterwards</h2> <p>Afterwards, it looks like this: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/03/loch-gefuellt-acryl-300x210.jpg"><img src="../images/2012/03/loch-gefuellt-acryl-300x210.jpg" alt="" width="300" height="210" class="size-medium wp-image-17361"/></a><p class="wp-caption-text"></p></div></p> <p>Hmm ... well ... it looks different when I look at it. I can barely see it as it&#39;s not that bright at the ceiling. Nether the less, I will have to paint in the summer.</p> Briefe mit LaTeX schreiben http://martin-thoma.com/briefe-mit-latex-schreiben Sat, 03 Mar 2012 16:48:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/briefe-mit-latex-schreiben <p>Ich muss immer wieder mal K&uuml;ndigungsschreiben aufsetzen. Daf&uuml;r will ich eigentlich keine Zeit verschwenden, aber es sollte schon gut aussehen. Also habe ich mir gerade mal eine Vorlage f&uuml;r K&uuml;ndigungsschreiben mit LaTeX und dem scrlttr2 Paket erstellt. Allerdings benutze ich noch die alten KOMA-Variablen. Ich finde mit KOMAold (siehe Beispiel-PDF <a href='../images/2012/03/kuendigung.pdf'>alt</a> und <a href='../images/2012/03/kuendigung-scrlttr2.pdf'>neu</a>) sieht es einfach besser aus als mit dem neuen. Obwohl der Unterschied nicht wirklich gro&szlig; ist.</p> <p>Hier ist das <a href='../images/2012/03/kuendigung-archiv.zip'>Archiv</a> mit beiden LaTeX-Dateien, einer Make-Datei und beiden PDF-Dateien.</p> <h2>LaTeX</h2> <div class="highlight"><pre><code class="text">\documentclass[a4paper, 12pt, KOMAold]{scrlttr2} \usepackage[utf8]{inputenc} % this is needed for umlauts \usepackage[ngerman]{babel} % this is needed for umlauts \usepackage[T1]{fontenc} % needed for right umlaut output in pdf \usepackage[ngerman, num]{isodate} % get DD.MM.YYYY dates % Anpassen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\Vorname}{Martin} % Vorname % \newcommand{\Nachname}{Thoma} % Nachname % \newcommand{\Strasse}{Parkstra&amp;szlig;e} % Deine Stra&amp;szlig;e % \newcommand{\Hausnummer}{17} % Deine Hausnummer % \newcommand{\PLZ}{76131} % Deine PLZ % \newcommand{\Ort}{Karlsruhe} % Dein Ort % \newcommand{\Kundennr}{123456} % Deine Kundennummer % % \newcommand{\Empfaenger}{DB Fernverkehr AG} % Der Empf&amp;auml;nger % \newcommand{\EStrasse}{BahnCard-Service} % Stra&amp;szlig;e des Empf&amp;auml;ngers % \newcommand{\EPLZ}{60643} % PLZ des Empf&amp;auml;ngers % \newcommand{\EOrt}{Frankfurt am Main} % Ort des Empf&amp;auml;ngers % % \newcommand{\DocTitle}{K&amp;uuml;ndigung des Bahn-Abos} %Titel des Dokuments% % Datum der K&amp;uuml;ndigung % \newcommand{\Kuendigungsdatum}{n&amp;auml;chstm&amp;ouml;glichen Termin} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % pdfinfo \pdfinfo{ /Author (\Nachname, \Vorname) /Title (\DocTitle) /Subject (\DocTitle) /Keywords (K&amp;uuml;ndigung) } % set letter variables \signature{\Vorname~\Nachname} \customer{\Kundennr} \backaddress{\Vorname~\Nachname, \Strasse~\Hausnummer, \PLZ~\Ort} % Begin document %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \begin{letter}{\Empfaenger \\ \EStrasse \\ \EPLZ~\EOrt} \date{\today}%Change this if you want a different date than today \subject{K&amp;uuml;ndigung} \opening{Sehr geehrte Damen und Herren,} hiermit k&amp;uuml;ndige ich meinen Vertrag f&amp;uuml;r die Kundennummer \Kundennr~ zum \Kuendigungsdatum.\\ \noindent Ich bitte um eine Best&amp;auml;tigung der K&amp;uuml;ndigung. \closing{Mit freundlichen Gr&amp;uuml;&amp;szlig;en,} \end{letter} \end{document} </code></pre></div> <p>Ach ja, wei&szlig; jemand wie man die Einr&uuml;ckung der Unterschrift verhindert?</p> Definitionen aus GBI http://martin-thoma.com/definitionen-aus-gbi Fri, 02 Mar 2012 15:16:02 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/definitionen-aus-gbi <h2>Formale Sprachen</h2> <p>A hei&szlig;t Alphabet <code>$:\Leftrightarrow$</code> A ist eine endliche, nicht leere Menge aus Zeichen. w hei&szlig;t Wort aus <code>$A^* : \Leftrightarrow$</code> w ist eine endliche Aneinanderreihung von Zeichen aus A L hei&szlig;t formale Sprache <code>$: \Leftrightarrow L \subseteq A^*$</code> G hei&szlig;t formale Grammatik <code>$: \Leftrightarrow G = (N, T, S, P)$</code> wobei: <ul> <li>N die endliche Menge der Nichtterminalsymbole bezeichne, </li> <li>T die endliche Menge der Terminalsymbole mit <code>$N \cap T = \emptyset$</code> bezeichne,</li> <li><code>$S \in N$</code> das Startsymbol,</li> <li><code>$P \subseteq N \times (N \cup T)^*$</code> die endliche Menge der Produktionen bezeichne.</li> </ul></p> <p>Es seien <code>$L_1$</code> und <code>$L_2$</code> formale Sprachen und <code>$n \in \mathbb{N}$</code>. Dann:</p> <p><code>$L_1 \cdot L_2 :\Leftrightarrow \{w_1 w_2 | w_1 \in L_1 \land w_2 \in L_2\}$</code> <code>$L_1 \cup L_2 :\Leftrightarrow \{w | w \in L_1 \lor w \in L_2\}$</code> <code>$L_1 \cap L_2 :\Leftrightarrow \{w | w \in L_1 \land w \in L_2\}$</code> <code>$L_1 \setminus L_2 :\Leftrightarrow \{w | w \in L_1 \land w \notin L_2\}$</code> <code>$L_1^0 :\Leftrightarrow \{ \varepsilon\}$</code> <code>$L_1^1 :\Leftrightarrow L$</code> <code>$L_1^n :\Leftrightarrow L_1^{n-1} \cdot L_1$</code> <code>$L_1^* :\Leftrightarrow \bigcup_{i=0}^\infty L_1^i$</code> <code>$L_1^+ :\Leftrightarrow L_1^* \setminus L_1^0 = \bigcup_{i=1}^\infty L_1^i$</code></p> <h3>Kodierungstheorie</h3> <p>Seien <code>$L_A, L_B$</code> formale Sprachen und <code>$c: L_A \rightarrow L_B$</code>.</p> <p>c hei&szlig;t codierung <code>$: \Leftrightarrow$</code> c ist injektiv. <code>$L_B$</code> hei&szlig;t pr&auml;fixfrei <code>$: \Leftrightarrow \forall_{u, v, w \in L_B}: uv = w \Rightarrow u = \varepsilon \lor v = \varepsilon$</code></p> <p>Sei <code>$h:A* \rightarrow B*$</code> eine Abbildung. h hei&szlig;t Homomorphismus <code>$:\Leftrightarrow h(\varepsilon) = \varepsilon \land \forall_{x \in A} \forall_{w \in A*}: h(xw) = h(x)h(w)$</code></p> <h2>Abbildungen und Relationen</h2> <p>Seien A und B Mengen.</p> <p>R hei&szlig;t bin&auml;re Relation von A in B <code>$:\Leftrightarrow R \subseteq A \times B$</code> </p> <p>Sei im Folgendem R eine bin&auml;re Relation von A in B.</p> <p>R ist linkstotal <code>$:\Leftrightarrow \forall_{a \in A} : \exists_{b \in B} : (a, b) \in R$</code> R ist rechtseindeutig <code>$:\Leftrightarrow \forall_{a \in A} : \forall_{b_1, b_2 \in B: b_1 \neq b_2} : (a, b_1) \in R \Rightarrow (a, b_2) \notin R$</code> R hei&szlig;t Abbildung <code>$:\Leftrightarrow$</code> R ist linkstotal und rechtseindeutig. F&uuml;r Abbildungen schreibt man auch: <code>$R: A \rightarrow B$</code>.</p> <p>R hei&szlig;t linkseindeutig <code>$:\Leftrightarrow \forall_{(a_1, b_1) \in R} : \forall_{(a_2, b_2) \in R} : (a_1, b_1) \in R \Rightarrow (a_2, b_2) \notin R$</code> R hei&szlig;t injektiv <code>$:\Leftrightarrow$</code> R ist eine linkseindeutige Abbildung. R hei&szlig;t rechtstotal <code>$:\Leftrightarrow \forall_{b \in B} : \exists_{a \in A} : (a, b) \in R$</code> R hei&szlig;t surjektiv <code>$:\Leftrightarrow$</code> R ist eine rechtstotale Abbildung. R hei&szlig;t bijektiv <code>$:\Leftrightarrow$</code> R ist eine injektive und surjektive Abbildung</p> <p>R hei&szlig;t reflexiv <code>$:\Leftrightarrow \forall_{x \in A} : (x, x) \in R$</code> R hei&szlig;t symmetrisch <code>$:\Leftrightarrow (x, y) \in R \rightarrow (y, x) \in R$</code> R hei&szlig;t antisymmetrisch <code>$:\Leftrightarrow (x, y) \in R \land (y, x) \in R \Rightarrow x = y$</code> R hei&szlig;t transitiv <code>$:\Leftrightarrow (x, y) \in R \land (y, z) \in R \Rightarrow (x, z) \in R$</code></p> <p>R hei&szlig;t Halbordnung <code>$:\Leftrightarrow$</code> R ist reflexiv, antisymmetrisch und transitiv. Eine Halbordnung ist ein Spezialfall der Ordnungsrelation.</p> <p>R hei&szlig;t &Auml;quivalenzrelation <code>$:\Leftrightarrow$</code> R ist reflexiv, symmetrisch und transitiv.</p> <p>Sei C eine Menge und <code>$S \subseteq B \times C$</code>. <code>$S \circ R = \{(x,z) \in M_1 \times M_3 | \exists y \in M_2: (x, y) \in R \land (y, z) \in S\}$</code></p> <p>Sei M eine Menge und <code>$R \subseteq M \times M$</code> eine Halbordnung. Dann hei&szlig;t M halbgeordnet bzw. <code>$(M, R)$</code> halbgeordnete Menge. Sei <code>$T \subseteq M$</code>. <code>$x \in T$</code> hei&szlig;t minimales Element von T <code>$:\Leftrightarrow$</code> Es gibt kein <code>$y \in T$</code> mit xRy und <code>$x \neq y$</code>. <code>$x \in T$</code> hei&szlig;t kleinstes Element von T <code>$:\Leftrightarrow$</code> <code>$\forall_{y \in T}: xRy$</code>. Das maximale Element und das gr&ouml;&szlig;te Element werden analog definiert.</p> <p>R hei&szlig;t vollst&auml;ndige Halbordnung <code>$:\Leftrightarrow$</code> R ist eine Halbordnung, besitzt ein kleinstes Element und jede aufsteigende Kette besitzt ein Supremum. R hei&szlig;t Totalordnung <code>$:\Leftrightarrow \forall_{a,b \in M} : aRb \lor bRa$</code> </p> <p>Sei <code>$\equiv \subseteq M \times M$</code> eine &Auml;quivalenzrelation, <code>$f : M \rightarrow M$</code> eine Funktion und <code>$\diamond$</code> eine bin&auml;re Operation auf der Menge M. <code>$f$</code> hei&szlig;t vertr&auml;glich <code>$: \Leftrightarrow \forall_{x,y \in M} : x \equiv y \Rightarrow f(x) \equiv f(y)$</code> <code>$\diamond$</code> hei&szlig;t vertr&auml;glich <code>$: \Leftrightarrow \forall_{x_1, x_2,y_1, y_2 \in M} : x_1 \equiv x_2 \land y_1 \equiv y_2 \Rightarrow x_1 \diamond y_1 \equiv x_2 \diamond y_2$</code></p> <h2>Komplexit&auml;tstheorie</h2> <p>Seien <code>$f : \mathbb{N_0} \rightarrow \mathbb{R}^+, g : \mathbb{N_0} \rightarrow \mathbb{R}^+$</code> Funktionen, die die Laufzeit von Algorithmen beschreiben.</p> <p><code>${\cal O}(f(n)) = \{g(n) | \exists_{n_0 \in \mathbb{N}_0} : \exists_{c \in \mathbb{R}^+} : \forall_{n \geq n_0}: g(n) \leq c \cdot f(n)\}$</code> <code>$\Omega(f(n)) = \{g(n) | \exists_{n_0 \in \mathbb{N}_0} : \exists_{c \in \mathbb{R}^+} : \forall_{n \geq n_0}: g(n) \geq c \cdot f(n)\}$</code> <code>$\Theta(f(n)) = \Omega(f(n)) \cap {\cal O}(f(n))$</code></p> <h2>Graphentheorie</h2> <p>G hei&szlig;t Graph <code>$: \Leftrightarrow G = (V, E)$</code>, wobei V eine endliche Menge an Knoten ist und <code>$E \subseteq V \times V$</code> die Menge der Kanten bezeichne.</p> <p>Sei G = (V, E) ein Graph. G hei&szlig;t ungerichteter Graph <code>$: \Leftrightarrow \forall_{v_n, v_m \in V} : (v_n, v_m) \in E \Rightarrow (v_m, v_n) \in E$</code> G hei&szlig;t gerichteter Graph <code>$: \Leftrightarrow$</code> G ist nicht ungerichtet. G hei&szlig;t streng zusammenh&auml;ngend <code>$: \Leftrightarrow \forall_{x, y \in V}:$</code> Es gibt einen Pfad von x nach y. G hei&szlig;t vollst&auml;ndig <code>$: \Leftrightarrow \forall_{x, y \in V}: (x, y) \in E$</code></p> <p>p hei&szlig;t Pfad in G von <code>$v_0$</code> nach <code>$v_n: \Leftrightarrow p = (v_0, ..., v_n): \forall_{i \in \mathbb{G}_n}: (v_i, v_{i+1}) \in E $</code></p> <p>Ein Knoten <code>$r \in V$</code> hei&szlig;t Wurzel <code>$: \Leftrightarrow \forall_{x \in V}:$</code> Es gibt genau einen Pfad von r nach x. G hei&szlig;t Baum <code>$: \Leftrightarrow \exists r \in V: \forall_{x \in V}$</code> Es gibt genau einen Pfad von r nach x.</p> Get your programs assembly code and more information http://martin-thoma.com/get-your-programs-assembly-code-and-more-information Thu, 01 Mar 2012 18:40:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/get-your-programs-assembly-code-and-more-information <p>I&#39;ve talked today with a fellow student about some system internals and we weren&#39;t sure what actually happens. So I needed the assembly code of some example programs.</p> <h2>General Information</h2> <p>It is important to know that I will use <strong>AT&amp;T syntax</strong> in this article! This is AT&amp;T Syntax: </p> <div class="highlight"><pre><code class="text">movl %esp, %ebp </code></pre></div> <p>And this is Intel Syntax:</p> <div class="highlight"><pre><code class="text">MOVL EBP, ESP </code></pre></div> <h3>Pointers</h3> <ul> <li><strong>%esp</strong>: Stack pointer for top address of the stack.</li> <li><strong>%ebp</strong>: Stack base pointer for holding the address of the current stack frame.</li> <li><strong>%eax</strong>: Accumulator</li> </ul> <p>The size of the eax register will always be 32 bit, regardless of the system&#39;s register size.<small><sup><a href="#ref6">[6]</a></sup></small></p> <h3>`$ Dollar and % Percentage signs</h3> <p>$<code>i, with</code>$i \in mathbb{N}$`, is a constant and percentages mean registers.<small><sup><a href="#ref10" name="anchor10">[10]</a></sup></small><small><sup><a href="#ref10" name="anchor11">[11]</a></sup></small></p> <h3>Instruction</h3> <p><strong>pushl <register></strong>: To push the source operand onto the stack<small><sup><a href="#ref1" name="anchor1">[1]</a></sup></small> <strong>movl <from>, <to></strong>: moves a long<small><sup><a href="#ref2" name="anchor2">[2]</a></sup></small> <strong>call <function></strong>: Calls function (which might be printf, putchar, ...) <strong>subl <code>$16, %esp&lt;/strong&gt;: allocate a local variable&lt;small&gt;&lt;sup&gt;&lt;a href=&quot;#ref3&quot; name=&quot;anchor3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;&lt;/small&gt; &lt;strong&gt;ret&lt;/strong&gt;: transfers control back to the place where the current function was called.&lt;small&gt;&lt;sup&gt;&lt;a href=&quot;#ref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;&lt;/small&gt; &lt;strong&gt;leave&lt;/strong&gt;: sets the stack pointer to the base frame address, effectively releasing the whole frame&lt;small&gt;&lt;sup&gt;&lt;a href=&quot;#ref4&quot; name=&quot;anchor4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/small&gt; &lt;strong&gt;andl $</code>-16, %esp</strong>: Ands the stack with fffffff0 which effectivly aligns it on a 16 byte boundary. Access to aligned values on the stack are much faster than if they were unaligned. <small><sup><a href="#ref5" name="anchor5">[5]</a></sup></small> <strong>jmp <target></strong>: Jump to target label. <strong>jbe <target></strong>: Jump below or equal. I am not quite sure what is compared ... can anybody help me? <strong>leal <command-address> <store></strong>: Load effective address.<small><sup><a href="#ref9" name="anchor9">[9]</a></sup></small> The LEA instruction never reads memory, it only computes the address that would be read by another instruction and stores this address in its first register operand.</p> <h4>Suffixes</h4> <p>Many instructions have suffixes. This is what they mean<small><sup><a href="#ref6" name="anchor6">[6]</a></sup></small>: <ul> <li>b: byte (8 bit)</li> <li>s: short (16 bit integer) or single (32-bit floating point)</li> <li>w: word (16 bit)</li> <li>l: long (32 bit integer or 64-bit floating point)</li> <li>q: quad (64 bit)</li> <li>t: ten bytes (80-bit floating point)</li> </ul></p> <h2>Simple example</h2> <h3>C-Code</h3> <p>This program simply outputs </p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%i&quot;</span><span class="p">,</span> <span class="mi">1337</span><span class="o">*</span><span class="mi">42</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h3>Assembly</h3> <p>Now I compile it and I save the assembly code:</p> <div class="highlight"><pre><code class="bash">gcc -S test.c<span class="p">;</span> gcc test.c -o <span class="nb">test</span> </code></pre></div> <p>This gives me test.s (the assembly code) and an executable called &quot;test&quot;.</p> <div class="highlight"><pre><code class="text"> .file &quot;test.c&quot; .section .rodata .LC0: .string &quot;%i&quot; .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl `$-16, %esp subl $`16, %esp movl `$.LC0, %eax movl $`56154, 4(%esp) movl %eax, (%esp) call printf movl `$0, %eax leave ret .size main, .-main .ident &quot;GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3&quot; .section .note.GNU-stack,&quot;&quot;,@progbits </code></pre></div> <p>This is code of the <a href="http://en.wikipedia.org/wiki/GNU_Assembler">GNU Assembler</a>. I guess other assemblers might produce other code. Could anybody please give me an example of other assemblers?</p> <p>The first and most important thing you might notice is that neither &quot;1337&quot; nor &quot;42&quot; appear in the assembly code, but 56154 which is 1337*42. I didn&#39;t use any optimization options! You might also notice that constants begin with a dollar sign and registers (esp, ebp) begin with a percent sign.</p> <p>The following ones are called assembly directives. They tell the assembler what to do next. <a href="http://tigcc.ticalc.org/doc/gnuasm.html#SEC90">.file</a>, <a href="http://tigcc.ticalc.org/doc/gnuasm.html#SEC119">.section</a>, <a href="http://tigcc.ticalc.org/doc/gnuasm.html#SEC123">.size</a> and <a href="http://tigcc.ticalc.org/doc/gnuasm.html#SEC95">.ident</a> are such directives. .data might be the most well-known one and tells the assembler to store something in the data segment of the program. .LC0 is a label for the immediately following string. .globl indicates that the following label (in this case &quot;main&quot;) is a global symbol.</p> <p>Line 14: I&#39;m not quite sure why you need the 4. I thought the integer size could be the reason (see <a href="http://www.cplusplus.com/doc/tutorial/variables/">variable sizes in C</a>), but as I used a string it still worked. As I used a character, it disappeared.</p> <h3>Further information</h3> <p><code>objdump</code> gives even more information!</p> <p>Archive header information: objdump -a test</p> <div class="highlight"><pre><code class="text">test: file format elf32-i386 test </code></pre></div> <p>File header information: objdump -f test</p> <div class="highlight"><pre><code class="text">test: file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x08048330 </code></pre></div> <p>Object specific file header contents: objdump -p test</p> <div class="highlight"><pre><code class="text">test: file format elf32-i386 Program Header: PHDR off 0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2 filesz 0x00000100 memsz 0x00000100 flags r-x INTERP off 0x00000134 vaddr 0x08048134 paddr 0x08048134 align 2**0 filesz 0x00000013 memsz 0x00000013 flags r-- LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 filesz 0x000004d8 memsz 0x000004d8 flags r-x LOAD off 0x00000f0c vaddr 0x08049f0c paddr 0x08049f0c align 2**12 filesz 0x00000108 memsz 0x00000110 flags rw- DYNAMIC off 0x00000f20 vaddr 0x08049f20 paddr 0x08049f20 align 2**2 filesz 0x000000d0 memsz 0x000000d0 flags rw- NOTE off 0x00000148 vaddr 0x08048148 paddr 0x08048148 align 2**2 filesz 0x00000044 memsz 0x00000044 flags r-- STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2 filesz 0x00000000 memsz 0x00000000 flags rw- RELRO off 0x00000f0c vaddr 0x08049f0c paddr 0x08049f0c align 2**0 filesz 0x000000f4 memsz 0x000000f4 flags r-- Dynamic Section: NEEDED libc.so.6 INIT 0x080482bc FINI 0x080484ac HASH 0x0804818c GNU_HASH 0x080481b4 STRTAB 0x08048224 SYMTAB 0x080481d4 STRSZ 0x0000004c SYMENT 0x00000010 DEBUG 0x00000000 PLTGOT 0x08049ff4 PLTRELSZ 0x00000018 PLTREL 0x00000011 JMPREL 0x080482a4 REL 0x0804829c RELSZ 0x00000008 RELENT 0x00000008 VERNEED 0x0804827c VERNEEDNUM 0x00000001 VERSYM 0x08048270 Version References: required from libc.so.6: 0x0d696910 0x00 02 GLIBC_2.0 </code></pre></div> <p>Display the contents of the section headers: objdump -h test</p> <div class="highlight"><pre><code class="text">test: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .interp 00000013 08048134 08048134 00000134 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .note.ABI-tag 00000020 08048148 08048148 00000148 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .note.gnu.build-id 00000024 08048168 08048168 00000168 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .hash 00000028 0804818c 0804818c 0000018c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .gnu.hash 00000020 080481b4 080481b4 000001b4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .dynsym 00000050 080481d4 080481d4 000001d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 .dynstr 0000004c 08048224 08048224 00000224 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .gnu.version 0000000a 08048270 08048270 00000270 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA 8 .gnu.version_r 00000020 0804827c 0804827c 0000027c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 9 .rel.dyn 00000008 0804829c 0804829c 0000029c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 10 .rel.plt 00000018 080482a4 080482a4 000002a4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 11 .init 00000030 080482bc 080482bc 000002bc 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 12 .plt 00000040 080482ec 080482ec 000002ec 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 13 .text 0000017c 08048330 08048330 00000330 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 14 .fini 0000001c 080484ac 080484ac 000004ac 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 15 .rodata 0000000b 080484c8 080484c8 000004c8 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 16 .eh_frame 00000004 080484d4 080484d4 000004d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 17 .ctors 00000008 08049f0c 08049f0c 00000f0c 2**2 CONTENTS, ALLOC, LOAD, DATA 18 .dtors 00000008 08049f14 08049f14 00000f14 2**2 CONTENTS, ALLOC, LOAD, DATA 19 .jcr 00000004 08049f1c 08049f1c 00000f1c 2**2 CONTENTS, ALLOC, LOAD, DATA 20 .dynamic 000000d0 08049f20 08049f20 00000f20 2**2 CONTENTS, ALLOC, LOAD, DATA 21 .got 00000004 08049ff0 08049ff0 00000ff0 2**2 CONTENTS, ALLOC, LOAD, DATA 22 .got.plt 00000018 08049ff4 08049ff4 00000ff4 2**2 CONTENTS, ALLOC, LOAD, DATA 23 .data 00000008 0804a00c 0804a00c 0000100c 2**2 CONTENTS, ALLOC, LOAD, DATA 24 .bss 00000008 0804a014 0804a014 00001014 2**2 ALLOC 25 .comment 00000023 00000000 00000000 00001014 2**0 CONTENTS, READONLY </code></pre></div> <p>Display DWARF info in the file: objdump --dwarf test</p> <div class="highlight"><pre><code class="text">test: file format elf32-i386 Contents of the .eh_frame section: 00000000 ZERO terminator </code></pre></div> <p>By the way, <a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a> is an executable file format and <a href="http://en.wikipedia.org/wiki/DWARF">DWARF</a> is a debugging file format. I guess they had to think quite long to find this <a href="http://en.wikipedia.org/wiki/Backronym">backronym</a>.</p> <h2>Fibonacci</h2> <h3>C-Code</h3> <p>This is the most simple version of Fibonacci I could find:<small><sup><a href="#ref7" name="anchor7">[7]</a></sup></small></p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">fib</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="o">?</span> <span class="n">n</span> <span class="o">:</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%i&quot;</span><span class="p">,</span> <span class="n">fib</span><span class="p">(</span><span class="mi">13</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <h3>Assembly</h3> <div class="highlight"><pre><code class="text"> .file &quot;test.c&quot; .text .globl fib .type fib, @function fib: pushl %ebp movl %esp, %ebp pushl %ebx subl $`20, %esp cmpl `$1, 8(%ebp) jbe .L2 movl 8(%ebp), %eax subl $`1, %eax movl %eax, (%esp) call fib movl %eax, %ebx movl 8(%ebp), %eax subl `$2, %eax movl %eax, (%esp) call fib leal (%ebx,%eax), %eax jmp .L3 .L2: movl 8(%ebp), %eax .L3: addl $`20, %esp popl %ebx popl %ebp ret .size fib, .-fib .section .rodata .LC0: .string &quot;%i&quot; .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl `$-16, %esp subl $`16, %esp movl `$13, (%esp) call fib movl $`.LC0, %edx movl %eax, 4(%esp) movl %edx, (%esp) call printf movl `$0, %eax leave ret .size main, .-main .ident &quot;GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3&quot; .section .note.GNU-stack,&quot;&quot;,@progbits </code></pre></div> <h2>References</h2> <ol> <li><a name="ref1" href="#anchor1">&uarr;</a>: <a href="http://www.cs.auckland.ac.nz/references/macvax/op-codes/Instructions/pushl.html">PUSHL Instruction</a>. The University of Auckland, Department of Computer Science.</li> <li><a name="ref2" href="#anchor2">&uarr;</a>: <a href="http://www.cse.nd.edu/~dthain/courses/cse40243/fall2008/ia32-intro.html">IA-32 Assembly for Compiler Writers</a>. Douglas Thain, Associate Professor, University of Notre Dame, Department of Computer Science and Engineering.</li> <li><a name="ref3" href="#anchor3">&uarr;</a>: <a href="http://linuxgazette.net/issue94/ramankutty.html">From C To Assembly Language </a>. Hiran Ramankutty, Linux Gazett, Issue 94.</li> <li><a name="ref4" href="#anchor4">&uarr;</a>: <a href="http://stackoverflow.com/questions/5474355/about-leave-in-x86-assembly">About leave in x86 assembly</a>. zneak, Stackoverflow.</li> <li><a name="ref5" href="#anchor5">&uarr;</a>: <a href="http://stackoverflow.com/a/1317324/562769">GCC's assembly output of an empty program on x86, win32</a>. nos, Stackoverflow.</li> <li><a name="ref6" href="#anchor6">&uarr;</a>: <a href="http://stackoverflow.com/a/1898896/562769">Why would one use &ldquo;movl $`1, %eax&rdquo; as opposed to, say, &ldquo;movb `$1, %eax&rdquo;</a>. Jason, Stackoverflow.</li> <li><a name="ref7" href="#anchor7">&uarr;</a>: <a href="http://en.literateprograms.org/Fibonacci_numbers_%28C%29#Recursive">Fibonacci numbers (C)</a>. Literate Programs.</li> <li><a name="ref8" href="#anchor8">&uarr;</a>: <a href="http://wpage.unina.it/rcanonic/didattica/ce1/docs/68000.pdf"> The 68000's Instruction Set</a>, page 27. Literate Programs.</li> <li><a name="ref9" href="#anchor9">&uarr;</a>: <a href="http://stackoverflow.com/questions/4003894/leal-assembler-instruction">LEAL Assembler instruction</a>. Nils Pipenbrinck, Stackoverflow</li> <li><a name="ref10" href="#anchor10">&uarr;</a>: <a href="http://stackoverflow.com/a/5367004/562769">What does this dollar sign mean in __asm?</a>. Zimbabao, Stackoverflow</li> <li><a name="ref11" href="#anchor11">&uarr;</a>: <a href="http://stackoverflow.com/a/9196757/562769">What do the dollar ($`) and percentage (%) signs represent in assembly intel x86?</a>. Necrolis, Stackoverflow</li> </ol> Creating pdf-forms with LaTeX http://martin-thoma.com/creating-pdf-forms-with-latex Wed, 29 Feb 2012 14:11:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/creating-pdf-forms-with-latex <p>I&#39;ve just stumbled across a full, working example how to create a html form within an LaTeX document. You can fill this form within your PDF-Reader. Here is the <a href='../images/2012/02/pdf-form.pdf'>example PDF-file</a>.</p> <p>It looks like this in Chromes PDF reader: <div style="width: 421px" class="wp-caption aligncenter"><a href="../images/2012/02/pdf-latex-form-chrome.png"><img src="../images/2012/02/pdf-latex-form-chrome.png" alt="" width="421" height="279" class="size-full wp-image-16711"/></a><p class="wp-caption-text"></p></div></p> <div class="highlight"><pre><code class="text">\documentclass[a4paper,12pt]{article} \usepackage{amssymb} % needed for math \usepackage{amsmath} % needed for math \usepackage[utf8]{inputenc} % this is needed for german umlauts \usepackage[ngerman]{babel} % this is needed for german umlauts \usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf \usepackage[margin=2.5cm]{geometry} %layout \usepackage{hyperref} % this is needed for forms and links within the text \hypersetup{ pdfauthor = {Martin Thoma}, pdfkeywords = {Martin Thoma, exmple, LaTeX, form}, pdftitle = {An example for a LaTeX form} } \begin{document} \title{An example for a LaTeX form} \author{Martin Thoma} \date{\today} \section{An example for a \LaTeX~form} \begin{Form}[action=mailto:info@example.com,encoding=html,method=post] \subsection{Some general information:} \begin{tabbing} xxxxxxxxxx: \= \kill % This is needed for the right tab width Name: \&gt; \TextField[name=name,width=3cm,charsize=12pt] {\mbox{}} Prename: \TextField[name=vor,width=3cm,charsize=12pt] {\mbox{}} \\ City: \&gt; \ChoiceMenu[combo,name=city,width=5cm,charsize=12pt,default=Karlsruhe]{\mbox{}} {Chemnitz,Dresden,Leipzig,Berlin,Hamburg,Karlsruhe,M&amp;uuml;nchen} \\ Sex: \&gt; \ChoiceMenu[radio,default=f,name=sex,charsize=14pt]{\mbox{}}{Male=m,Female=f} \end{tabbing} \subsection{Education:} \CheckBox[name=highschool,charsize=12pt]{High School} \CheckBox[name=college,charsize=12pt]{College} \CheckBox[name=university,charsize=12pt]{University} \\ \Submit{Submit} \Reset{Clear} \hfill ~\\ \end{Form} \end{document} </code></pre></div> <p>You can save this as pdf-form.tex and run this command in Linux:</p> <div class="highlight"><pre><code class="bash">pdflatex pdf-form.tex -output-format<span class="o">=</span>pdf </code></pre></div> <p>It seems as if the \ChoiceMenu radio option is buggy at the moment. Does anybody know how to fix that? edit: Hmm ... it works in Chromes PDF reader, but not in Document Viewer. Mayby Document Viewer is buggy.</p> <h2>Sources</h2> <ul> <li>TeX Users Group: <a href="http://www.tug.org/applications/hyperref/manual.html#x1-190006">PDF and HTML forms</a></li> <li><a href="http://www.qucosa.de/fileadmin/data/qucosa/documents/4512/data/vortrag2.pdf">Teil 2: LATEX und PDF</a> - TU Chemnitz (German)</li> <li><a href="http://www2.informatik.hu-berlin.de/~piefel/LaTeX-PS/Archive-2004/V12-PDF.pdf">Dokumentation der HU Berlin</a> (German)</li> </ul> GBI-Klausur http://martin-thoma.com/gbi-klausur Tue, 28 Feb 2012 18:30:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/gbi-klausur <p>F&uuml;r die Klausur in den Grundbegriffe der Informatik (GBI) sollte man Folgendes auf jeden Fall wissen: <ul> <li>Wie funktionieren Induktionsbeweise? &rarr; <a href="../wie-fuhre-ich-einen-induktionsbeweis/" title="Wie f&uuml;hre ich einen Induktionsbeweis?">Antwort</a></li> <li>Was ist ein Alphabet, eine formale Sprache und was eine formale Grammatik? &rarr; <a href="../definitionen-aus-gbi/#Formale_Sprachen" title="Definitionen aus GBI">Antwort</a></li> <li>Was bedeuten f&uuml;r zwei Formale Sprachen <code>$L_1, L_2$</code> folgende bin&auml;ren Operationen:<code>$\cdot, \cup, \cap, \setminus, L_1^3, L^+, L^*$</code>? &rarr; <a href="../definitionen-aus-gbi/#Formale_Sprachen" title="Definitionen aus GBI">Antwort</a></li> <li>Was ist eine Abbildung, was eine Relation? &rarr; <a href="../definitionen-aus-gbi/#Abbildungen_und_Relationen" title="Definitionen aus GBI">Antwort</a></li> <li>Was ist Injektivit&auml;t, Surjektivit&auml;t, Bijektivit&auml;t, Reflexivit&auml;t, Symmetrie, Antisymmetrie und Transitivit&auml;t? &rarr; <a href="../definitionen-aus-gbi/#Abbildungen_und_Relationen" title="Definitionen aus GBI">Antwort</a></li> <li>Wie ist eine &Auml;quivalenzrelation, eine Ordnungsrelation, eine Halbordnung und eine Totalordnung definiert? &rarr; <a href="../definitionen-aus-gbi/#Abbildungen_und_Relationen" title="Definitionen aus GBI">Antwort</a></li> <li>Wie ist ein minimales Element und wie das kleinste Element einer Halbordnung definiert? &rarr; <a href="../definitionen-aus-gbi/#Abbildungen_und_Relationen" title="Definitionen aus GBI">Antwort</a></li> <li>Wie sind die Landau-Symbole <code>$\cal O(f(n)), \Theta(f(n)), \Omega(f(n))$</code> definiert? &rarr; <a href="../definitionen-aus-gbi/#Komplexittstheorie" title="Definitionen aus GBI">Antwort</a> und <a href="../die-landau-symbole/">Nachtrag</a></li> <li>Was ist eine Turingmaschine und wie gibt man eine Konfiguration davon an?</li> <li>Wie ist ein Graph definiert und wie ein Baum? &rarr; <a href="../definitionen-aus-gbi/#Graphen" title="Definitionen aus GBI">Antwort</a></li> <li>Wann sind zwei Graphen isomorph?</li> <li>Was ist eine Pfad, eine Schlinge, ein Kreis und ein Zyklus?</li> <li>Wann ist ein Graph zusammenh&auml;ngend und wann vollst&auml;ndig / streng zusammenh&auml;ngend?</li> <li>Was ist eine Adjazenzmatrix und was ist eine Wegematrix?</li> <li>Wie lautet die Wahrheitstabelle von <code>$A \Rightarrow B$</code>?</li> <li>Wie unterscheiden sich Mealy- und Moore-Automaten? Welche Sprachen akzeptieren sie und wie stellt man sie dar?</li> <li>Was ist eine Huffman-Kodierung und wie stellt man sie dar?</li> <li>Was haben alle W&ouml;rter einer &Auml;quivalenzklasse der Nerode-Relation gemeinsam?</li> <li>Was ist ein Hasse-Diagramm?</li> <li>Wie lautet das Master-Theorem? &rarr; <a href="http://de.wikipedia.org/wiki/Master-Theorem#Allgemeine_Form">Antwort</a></li> </ul></p> <p>Wenn die Antwort auf eine dieser Fragen noch unklar ist, sollte man sich das <a href="http://gbi.ira.uka.de/vorlesungen/skript.pdf">Skript</a> nochmals anschauen.</p> <p>Was man auf jeden Fall &uuml;ben sollte, sind die Aufgaben zu Turingmaschinen. Das kommt sicher dran und man ist sicher zu langsam, wenn man nicht ein paar Aufgaben dazu macht.</p> <h2>Some Random Facts</h2> <ul> <li>Ein Mebibyte (MiB) sind `$2^{20}$` Byte, ein Megabyte (MB) sind `$10^6$` Byte.</li> <li>`$\{\varepsilon\} \neq \emptyset = \{\}$`</li> <li>`$\cal P(\emptyset) = \{\emptyset\} = \{\{\}\}$` und `$|{\cal P}(\emptyset)| = 1$`, aber `$|\emptyset| = 0$`.</li> <li>`$Num_2(111)$` ist die Zahl 7, `$Repr_2$`(die Zahl 7) = 111</li> <li>`$\langle \emptyset \rangle = \{\}$` und `$\langle \emptyset * \rangle = \{\varepsilon\}$`</li> <li>Ein paar Beziehungen von Komplexit&auml;tsklassen: <ul> <li>`${\cal O}(\log(n)) \subsetneq {\cal O}(n)$`</li> <li>`${\cal O}(n^{2.1}) \subsetneq {\cal O}(n^{2.2})$`</li> <li>`${\cal O}(n^{100}) \subsetneq {\cal O}(n!)$`</li> <li>`${\cal O}(2^n) \subsetneq {\cal O}(n!) \subsetneq {\cal O}(n^n) \subsetneq {\cal O}(2^{n^2})$`</li> <li>`${\cal O}((n^n)^n) \subsetneq {\cal O}(n^{(n^3)})$`</li> </ul> </li> <li>Logarithmusgesetze: <ul> <li>`$\log(x \cdot y) = \log(x) + \log(y)$`</li> <li>`$\log(\frac{x}{y}) = \log(x) - \log(y)$`</li> <li>`$\log(x^r) = r \cdot \log(x)$`</li> </ul> </li> <li>Ein minimaler Endlicher Automat zu einer regul&auml;re Sprache L hat n Zust&auml;nde `$\Leftrightarrow$` Es gibt n &Auml;quivalenzklassen bzgl. der Nerode-Relation zu L.</li> <li>Der Index der Nerode-Relation zu einer Sprache L ist nicht endlich `$\Leftrightarrow$` L ist nicht regul&auml;r</li> <li>`$S \circ R = \{(x, z) \in M_1 \times M_3 | \exists y \in M_2: (x, y) \in R \land (y, z) \in S\}$`</li> <li>r ist Wurzel von `$G = (V, E) \Leftrightarrow \forall x \in V : $` Es gibt genau einen Pfad von r nach x.</li> </ul> <p>Zum &Uuml;ben habe ich mal eine &quot;Klausur&quot; erstellt. Hier ist die <a href='../images/2012/02/gbi-klausurvorbereitung.pdf'>PDF</a> und hier die <a href='../images/2012/02/gbi-klausurvorbereitung.zip'>LaTeX</a>-Datei.</p> <h3>Gro&szlig;-O-Notation</h3> <p><strong>Beh</strong>: <code>$\mathcal{O}(n!) \nsubseteq \mathcal{O}(2^n)$</code></p> <p><strong>Bew</strong>: z.Z.: <code>$n! \notin \mathcal{O}(2^n)$</code></p> <p>Annahme: <code>$\exists c \in \mathbb{R}: n! \leq c \cdot 2^n$</code></p> <p><code>$n! \leq c \cdot 2^n\\ \Leftrightarrow \frac{n!}{2^n} \leq c\\ \Leftrightarrow \frac{\Pi_{i=1}^n i}{\Pi_{i=1}^n 2} \leq c\\ \Leftrightarrow \Pi_{i=1}^n \frac{i}{2} \leq c$</code></p> <p>Es gilt: <code>$\Pi_{i=1}^n \frac{i}{2} = \frac{1}{2} \cdot 1 \cdot \frac{3}{2} \Pi_{i=4}^n \frac{i}{2} \ge \frac{3}{4} \cdot 2^n $</code> <code>$\Rightarrow \forall c \in \mathbb{R} \exists n_0 \in \mathbb{N} \forall n \geq n_0: n! \geq c \cdot 2^n$</code></p> <p>Offensichtlich ist also <code>$\mathcal{O}(n!) \nsubseteq \mathcal{O}(2^n)$</code>.</p> <h2>Formalismen</h2> <ul> <li>Ableitungen benutzen Doppelpfeile, Ableitungsregeln einfache Pfeile.</li> <li>Bei ungerichteten Graphen werden die Kanten also Mengen mit zwei Elementen beschrieben, bei gerichteten als Tupel.</li> </ul> <h2>Termin</h2> <p>Alle wichtigen Informationen stehen auf der <a href="http://gbi.ira.uka.de/pruefungen/klausuren.html">Klausurseite</a>.</p> <p><strong>Datum</strong>: 05.03.2012 um 11:00 Uhr. Anwesend sollte man ab ca. 10:30 - 10:40 Uhr sein. <strong>Ort</strong>: <a href="http://gbi.ira.uka.de/pruefungen/hoersaal_einteilung_gbi_2012.pdf">Liste der Zuweisung</a> - Das sind ganze 729 Matrikelnummern! (Ich schreib im Benz). <strong>Dauer</strong>: 120 min. <strong>Punkte</strong>: 40 - 50, mit der H&auml;lfte hat man auf jeden Fall bestanden. <strong>Nicht vergessen</strong>: Studentenausweis <strong>Nachklausur</strong>: am 18.09.2012. Hinweise sind <a href="http://www.informatik.kit.edu/klausuren.php?kid=388.35">hier</a>.</p> <h2>Ergebnisse</h2> <p>Die <a href="http://gbi.ira.uka.de/pruefungen/aushang.pdf">Ergebnisse</a> sind nun hier verf&uuml;gbar.</p> <p>Das ist eine Notenverteilung, die mir ein Kommilitone zugeschickt hat: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/02/gbi-ergebnisse-300x231.jpg"><img src="../images/2012/02/gbi-ergebnisse-300x231.jpg" alt="" width="300" height="231" class="size-medium wp-image-19301"/></a><p class="wp-caption-text"></p></div></p> Stuxnet http://martin-thoma.com/stuxnet Fri, 24 Feb 2012 08:35:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/stuxnet <p>The following clip is a nice, short explanation of <a href="http://en.wikipedia.org/wiki/Stuxnet">Stuxnet</a>, a computer worm discovered in June 2010:</p> <iframe src="http://player.vimeo.com/video/25118844?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> Portal - Still Alive typography clip http://martin-thoma.com/portal-still-alive-typography-clip Thu, 23 Feb 2012 20:29:48 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/portal-still-alive-typography-clip <iframe src="http://player.vimeo.com/video/1612411?title=0&amp;byline=0&amp;portrait=0" width="512" height="307" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> 7 mind-blowing artists you didn't know http://martin-thoma.com/7-mind-blowing-artists-you-didnt-know Thu, 23 Feb 2012 18:56:14 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/7-mind-blowing-artists-you-didnt-know <h2>Anamorphic Art</h2> <p><a href="http://en.wikipedia.org/wiki/Anamorphosis">Anamorphosis</a> is a distorted projection or perspective requiring the viewer to use special devices or occupy a specific vantage point to reconstitute the image. </p> <p>Here is a good example by <a href="http://www.varini.org/">Felice Varini</a>: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/02/anamorphic-art.png"><img src="../images/2012/02/anamorphic-art.png" alt="" width="512" height="524" class="size-full wp-image-15541"/></a><p class="wp-caption-text"></p></div></p> <h2>Pavement Drawings</h2> <p>Pavement Drawings can be combined with anamorphic art. One great artist I&#39;ve found is <a href="http://www.julianbeever.net/pave.htm">Julian Beever</a>. Here is one example:</p> <div style="width: 450px" class="wp-caption aligncenter"><a href="../images/2012/02/pavement-drawing-snail.jpg"><img src="../images/2012/02/pavement-drawing-snail.jpg" alt="" width="450" height="300" class="size-full wp-image-15561"/></a><p class="wp-caption-text"></p></div> <h2>Hand Painting</h2> <p>You might already know body painting. <a href="http://www.guidodaniele.com/?page_id=8">Guido Daniele</a> does something very simmilar he calls &quot;Hand Painting&quot;. Here is one example: <div style="width: 509px" class="wp-caption aligncenter"><a href="../images/2012/02/hand-art-guido-daniele.jpg"><img src="../images/2012/02/hand-art-guido-daniele.jpg" alt="" width="509" height="340" class="size-full wp-image-15571"/></a><p class="wp-caption-text"></p></div></p> <h2>Hair Sculptures</h2> <p><a href="http://en.wikipedia.org/wiki/Willard_Wigan">Willard Wigan</a> is a sculptor from Birmingham, England, who makes microscopic art. His sculptures are typically placed in the eye of a needle or on the head of a pin. A single sculpture can be as small as 0.005 mm. Here is an example from his <a href="http://www.willard-wigan.com/gallery.aspx">gallery</a>: <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2012/02/Harry-Potter.jpg"><img src="../images/2012/02/Harry-Potter.jpg" alt="" width="512" height="319" class="size-full wp-image-15601"/></a><p class="wp-caption-text"></p></div></p> <h2>Sand Art</h2> <p>It is amazing what can be done with sand. <a href="http://en.wikipedia.org/wiki/Sudarshan_Pattnaik">Sudarsan Pattnaik</a> created this sculpture: <div style="width: 469px" class="wp-caption aligncenter"><a href="../images/2012/02/sand-art-global-warming-sudarshan-pattnaik.jpg"><img src="../images/2012/02/sand-art-global-warming-sudarshan-pattnaik.jpg" alt="" width="469" height="313" class="size-full wp-image-15621"/></a><p class="wp-caption-text"></p></div></p> <h2>Origami</h2> <p>Robert J. Lang seems to invest a serious amount of time in <a href="http://en.wikipedia.org/wiki/Origami">Origami</a>. His <a href="http://www.langorigami.com/art/gallery/gallery.php?tag=mammals&name=bull_moose">gallery of mammals</a> is very impressive. Here is a moose: <div style="width: 368px" class="wp-caption aligncenter"><a href="../images/2012/02/lang-origami-moose.png"><img src="../images/2012/02/lang-origami-moose.png" alt="" width="368" height="316" class="size-full wp-image-15651"/></a><p class="wp-caption-text"></p></div></p> <h2>Domino Day</h2> <p>This is not done by one artist, but it should be mentioned: <iframe width="512" height="377" src="http://www.youtube.com/embed/yeF7yLkEECs" frameborder="0" allowfullscreen></iframe></p> TGI-Klausur http://martin-thoma.com/tgi-klausur Sat, 18 Feb 2012 15:57:30 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/tgi-klausur <div class="info">Ich habe im WS 2011/2012 bei Frau <a href="http://i11www.iti.uni-karlsruhe.de/en/members/dorothea_wagner/index">Prof. Dr. Wagner</a> die TGI-Klausur am KIT geschrieben. Hierf&uuml;r entstand dieser Artikel.</div> <p>F&uuml;r die Klausur in den Theoretischen Grundlagen der Informatik sollte man Folgendes auf jeden Fall wissen:</p> <ul> <li>Wie konstruiert man mittels <strong>Potenzmengen</strong> einen &auml;quivalenten deterministischen endlichen Automaten zu einem Nichtdeterministischen? &rarr; <a href="../konstruktion-eines-deterministischen-endlichen-automaten-aus-einem-nicht-deterministischem/" title="Konstruktion eines deterministischen endlichen Automaten aus einem nicht-deterministischem">Antwort</a></li> <li>Wie bringt man eine Grammatik in <strong>Chomsky-Normalform</strong>? &rarr; <a href="../konstruktion-der-chomsky-normalform/" title="Konstruktion der Chomsky-Normalform">Antwort</a>.</li> <li>Was macht der <strong>CYK-Algorithmus</strong> und wie funktioniert er? &rarr; siehe <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/uebung7.pdf">Beispiel</a> ab Folie 15</li> <li>Was ist die <strong>Chomsky-Hirarchie</strong>, welche Grammatiken gibt es und mit welchen Operationen sind sie <strong>Abgeschlossen</strong>? &rarr; <a href="../sprachen-automaten-und-grammatiken/" title="Sprachen, Automaten und Grammatiken: Ein &Uuml;berblick">Antwort</a>.</li> <li>Was ist das Post'sche Korrespondenzproblem?</li> <li>Welche <strong>Komplexit&auml;tsklassen</strong> sind `$\cal P, NP, NPC, DTAPE, NTAPE, NPI$`? &rarr; <a href="../komplexitatsklassen-in-der-informatik-ein-uberblick/" title="Komplexit&auml;tsklassen in der Informatik: Ein &Uuml;berblick">Antwort</a></li> <li>Wie sind <strong>Kellerautomaten</strong> definiert, wann sind sie formal nicht-deterministisch und in welcher Beziehung stehen sie zur Greibach-Normalform? Wie formt man einen Kellerautomaten von einem akzeptierenden Endzustand in einen mit leerem Stack um? &rarr; <a href="../kellerautomat/" title="Kellerautomat">Antwort</a>.</li> <li>Wie lautet das <strong>Pumping-Lemma</strong> (f&uuml;r regul&auml;re und kontextfreie Sprachen? Wie lautet <strong>Ogdens Lemma</strong>? Und wie benutzt man diese f&uuml;r Beweise? &rarr; <a href="../pumping-lemma/" title="Eine Sprache ist nicht regul&auml;r &ndash; Beweis mit dem Pumping-Lemma">Antwort</a></li> <li>Wie beweist man <strong>NP-Vollst&auml;ndigkeit</strong>?</li> </ul> <h2>Some Random Facts</h2> <ul> <li>"aaa" ist in der Sprache aller Worter, die zwei mal "aa" enthalten. <small><sup><a href="#ref1" name="anchor1">[1]</a></sup></small></li> <li>Die Grammatik `$G_1(\{S\}, \{\varepsilon\}, \{S \rightarrow \varepsilon\},S)$` erzeugt die Sprache `$L(G_1) = \{\varepsilon\}$`.<small><sup><a href="#ref2" name="anchor2">[2]</a></sup></small></li> <li>Die Grammatik `$G_2(\{S\}, \{\varepsilon\}, \{\},S)$` erzeugt die Sprache `$L(G_2) = \{\}$`.</li> <li>`$L_1 := \{aba, bab, ab\}, L_2 := \{bb,ab,ba\}$`. Dann ist `$L_1 / L_2 = \{\varepsilon, a, b\}$` und `$L_1 \setminus L_2 = \{aba, bab\}$`<small><sup><a href="#ref3" name="anchor3">[3]</a></sup></small></li> <li>`$PKP \notin \cal NPC$`<small><sup><a href="#ref4" name="anchor4">[4]</a></sup></small></li> <li>Es kann sein, dass die Ableitung eines Wortes nicht eindeutig ist, aber der Syntaxbaum eindeutig ist.</li> <li>F&uuml;r jedes Wort w gibt es einen DEA, der w akzeptiert<small><sup><a href="#ref5" name="anchor5">[5]</a></sup></small></li> <li>`$L' \alpha L$` bedeutet, dass L' polynomial transformierbar in L ist.</li> <li>`$L' \alpha_T L$` bedeutet, dass L' Turing-reduzierbar in L ist.</li> </ul> <h2>Termin</h2> <p><strong>Datum</strong>: Mittwoch, der 22.02.2012 um 14:00 Uhr (siehe <a href="http://i11www.iti.uni-karlsruhe.de/teaching/winter2011/tgi/index">Vorlesungswebsite</a>) <strong>Ort</strong>: Steht <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/anmeldung.pdf">hier</a>. Ich schreibe im Tulla, manche noch im Gaede und andere im HS a. F., Daimler oder Benz. Laut dieser Liste schreiben 295 Personen diese Klausur! <strong>Dauer</strong>: 120 min. (siehe <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/tgi1112-t1.pdf">erste Folie</a>) <strong>Punkte</strong>: Bisher waren es meist ca. 60, von denen man 20 zum Bestehen ben&ouml;tigt hat. <strong>&Uuml;bungsschein</strong>: <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/scheine.pdf">Liste</a> der 195 Leute, die ihn bestanden haben. Der &Uuml;bungsschein bringt einen Klausurbonus. Allerdings habe ich keine Ahnung, wie hoch dieser ist. edit: +0,3 zur Klausurnot (Danke Alexander :-) )</p> <p>Ach ja, ich habe &quot;<a href="http://info.php-4.info/attachment.php?attachmentid=260&sid=dcc186e19164016b828792ff3c04a046">Yet Another Info 3 Resume</a>&quot; noch gar nicht verlinkt. Das ist sehr kurz und hat viele wichtige Informationen.</p> <h2>Klausurergebnisse</h2> <p>Die Klausurergebnisse sind nun <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/notenhk.pdf">&ouml;ffentlich</a>. Die Liste scheint nach Matrikelnummer sortiert zu sein ... tolle Anonymisierung, da wir ja auch im Saal nach Matrikelnummern sortiert waren. Und falls irgendjemand es vergessen hat: Hier ist die <a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/anmeldung.pdf">&ouml;ffentliche Liste der Matrikelnummern</a>. Tja, so werden wir verschaukelt was den Datenschutz angeht.</p> <p>edit: Das Leck scheint ausgebessert worden zu sein. Nun sind die Noten nach Klausur-ID sortiert. Sehr sch&ouml;n :-)</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/02/tgi-notenverteilung-300x257.png"><img src="../images/2012/02/tgi-notenverteilung-300x257.png" alt="" width="300" height="257" class="size-medium wp-image-18881"/></a><p class="wp-caption-text"></p></div> <h2>Einzelnachweise</h2> <ol> <li><a name="ref1" href="#anchor1">&uarr;</a>: 2. Klausur WS 2003/2004, Aufgabe 1a</li> <li><a name="ref2" href="#anchor2">&uarr;</a>: 1. Klausur WS 2003/2004, Aufgabe 5</li> <li><a name="ref3" href="#anchor3">&uarr;</a>: 1. Klausur WS 2007/2008, Aufgabe 3c</li> <li><a name="ref4" href="#anchor4">&uarr;</a>: 1. Klausur WS 2007/2008, Aufgabe 5</li> <li><a name="ref5" href="#anchor5">&uarr;</a>: 1. Klausur WS 2010/2011, Aufgabe 5</li> </ol> Kellerautomat http://martin-thoma.com/kellerautomat Fri, 17 Feb 2012 19:17:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/kellerautomat <p>Ein Kellerautomat ist ein Endlicher Automat mit einem Stack (&quot;Kellerspeicher&quot;). Er wird mit PDA (pushdown automaton) bzw. NPDA (nondeterministic pushdown automaton) abgek&uuml;rzt. </p> <p>Laut Wikipedia verwendet die Gleitkommaeinheit einen PDA. Dazu habe ich allerdings keine Quelle, das ist also mit Vorsicht zu genie&szlig;en.</p> <p>Ein weiterer Einsatzzweck ist die Syntaxanalyse einer Tokenfolge. Das kann f&uuml;r Compiler oder Interpreter von Interesse sein.</p> <h2>Definitionen</h2> <p>Der <strong>Kellerautomat</strong> ist als 7-Tupel definiert:</p> <p><code>$(Q, \Sigma, \Gamma, q_0, Z_0, \delta, F)$</code>, wobei <ul> <li>Q: endliche Zustandsmenge</li> <li><code>$\Sigma$</code>: endliches Eingabealphabet</li> <li><code>$\Gamma$</code>: endliches STACK-Alphabet</li> <li><code>$q_0 \in Q$</code>: Anfangszustand</li> <li><code>$Z_0 \in \Gamma$</code>: Initialisierung des STACK</li> <li><code>$\delta: Q \times (\Sigma \cup \{\varepsilon\}) \times \Gamma \rightarrow 2^{Q \times \Gamma^*}$</code>.</li> <li><code>$F \subseteq Q$</code>: Menge der akzeptierenden Endzust&auml;nde.</li> </ul></p> <p>Bemerkenswert ist hierbei, dass F leer sein kann. Dies ist m&ouml;glich, da ein PDA auch durch leeren Stack akzeptieren kann.</p> <p>Die Zustands&uuml;berf&uuml;hrungsfunktion ist etwas umst&auml;ndlich beschrieben. Dort steht, dass jede Regel folgende Form hat: <code>$\delta(\text{Zustand}, \text{Eingabesymbol}, \text{Stacksymbol}) = (\text{Neuer Zustand}, \text{Neuer Stack})$</code></p> <p>Die <strong>Konfiguration eines PDA</strong> ist ein Tripel <code>$(q, w, \alpha)$</code>, wobei <ul> <li><code>$q \in Q$</code>: aktueller Zustand</li> <li><code>$w \in \Sigma^*$</code>: der Teil der Eingabe, der noch nicht gelesen wurde</li> <li><code>$\alpha \in \Gamma^*$</code>: der STACK-Inhalt</li> </ul></p> <p>Ein PDA ist <strong>deterministisch</strong> <code>$: \Leftrightarrow |\delta(q, a, Z)| + |\delta(q, \varepsilon, Z)| \leq 1 ~~~ \forall_{q \in Q, a \in \Sigma, Z \in \Gamma}$</code>.</p> <h2>Anschaulich</h2> <p>Du hast einen Kartenstapel (deine Eingabe, auf der du immer nur ein Zeichen lesen darfst), einen Stapel f&uuml;r Notizzettel, wobei am Anfang nur ein Notizzettel dort liegt und immer nur ein Symbol auf dem Zettel steht (dein Stack, der mit <code>$Z_0 \in \Gamma$</code> initialisiert ist), einen Zustand und eine Menge Regeln (<code>$\delta$</code>).</p> <p>Nun schaust du dir in jedem Schritt die oberste Karte auf dem Kartenstapel an und legst sie weg. Des Weiteren schaust du dir deine oberste Notiz an und legst sie weg und &uuml;berpr&uuml;fst deinen Zustand. Aus diesen Informationen schlussfolgerst du, was du als n&auml;chstes machst. Du kannst dir aussuchen in welchen Zustand du gehen willst und was du noch auf deinen Notiz-Stapel tun willst. Du kannst auch einfach nichts auf den Notiz-Stapel legen.</p> <h2>Beispiele</h2> <p>Sei <code>$L = \{w \in \{0,1,2\}^* | w = 0^i1^j2^j ~~~ i, j \in \mathbb{N}\}$</code></p> <p><code>$(\{q_0, q_1, q_2\}, \{0, 1, 2\}, \{1, \#\}, q_0, \#, \delta, \emptyset)$</code> mit </p> <p><code>$\delta(q_0, 0, \#) = \{(q_0, \#), (q_1, \#)\}, $</code> <code>$\delta(q_1, 1, \#) = \{(q_1, 1)\}, $</code> <code>$\delta(q_1, 1, 1) = \{(q_1, 11)\}, $</code> <code>$\delta(q_1, 2, 1) = \{(q_2, \varepsilon)\}, $</code> <code>$\delta(p, a, Z) = \emptyset $</code> sonst.</p> <p>Der Kellerautomat akzeptiert durch leeren STACK. Aus diesem Grund legen wir am Anfang auch immer wieder # auf den Stack. Sonst w&uuml;rde der PDA zu fr&uuml;h akzeptieren.</p> <p>Da <code>$|\delta(q_0, 0, \#) = 2 &gt; 1|$</code> ist dieser Kellerautomat Nicht-Deterministisch.</p> <h2>Umformungen</h2> <h3>Akzeptierender Endzustand &rarr; leerer STACK</h3> <p>Siehe Skript von Prof. Dr. Dorothea Wagner, S. 107.</p> <p>Gegeben sei ein Kellerautomat <code>${\cal K}_1 (Q_1, \Sigma, \Gamma_1, \delta_1, q_0^1, Z_0^1, F_1)$</code> der durch akzeptierenden Endzustand akzeptiert. Wir wollen einen neuen Automaten <code>${\cal K}_2 (Q_2, \Sigma, \Gamma_2, \delta_2, q_0^2, Z_0^2, F_2)$</code> der durch leeren STACK akzeptiert. </p> <p><strong>Idee</strong>: Wir f&uuml;hren einen neuen Zustand <code>$q_E$</code> ein, bei dessen Erreichen wir den STACK leeren. Um zu verhindern, dass der STACK zwischenzeitlich leer wird, legen wir zu beginn das STACK-Symbol <code>$Z_0^2$</code> ab.</p> <p><strong>Formal</strong>: <code>$Q_2 := Q_1 \cup \{q_0^2, q_E\}$</code>, wobei <code>$q_0^2$</code> der neue Anfangszustand von <code>${\cal K}_2$</code> ist. <code>$\Gamma_2 := \Gamma_1 \cup \{Z_0^2\}$</code>, wobei <code>$Z_0^2$</code> den STACK initialisiert.</p> <p>Die Menge <code>$\delta_2(q, a, Z)$</code> f&uuml;r <code>$a \in \Sigma \cup \{\varepsilon\}$</code> und <code>$Z \in \Gamma_2$</code> sei durch folgende Bedingungen festgelegt:</p> <p>Sorge f&uuml;r die gleiche Anfangssituation: <code>$\delta_2(q_0^2, \varepsilon, Z_0^2) = \{(q_0^1, Z_0^1Z_0^2)\}$</code></p> <p>Falls der Zustand, das gelesene Zeichen und das STACK-Symbol im &quot;alten&quot; Automaten sind, dann wie gehabt: <code>$\delta_2(q, a, Z) = \delta_1(q, a, Z) \text{f&amp;uuml;r } (q \in Q_1, a \neq \varepsilon, Z \in \Gamma_1) \lor (q \in Q_1 \setminus F_1, a = \varepsilon, Z \in \Gamma_1)$</code></p> <p>Sorge daf&uuml;r, dass die STACK-Leerungsregel aufgerufen wird, falls der Zustand akzeptierend ist: <code>$\delta_2(q, \varepsilon, Z) = \delta_1(q, \varepsilon, Z) \cup \{(q_E, \varepsilon)\} \text{f&amp;uuml;r } q \in F_1, Z \in \Gamma_2$</code></p> <p>Diese Regel leert den STACK: <code>$\delta_2(q_E, \varepsilon, Z) = \{(q_E, \varepsilon)\} \text{ f&amp;uuml;r } Z \in \Gamma_2$</code></p> <h3>Leerer STACK &rarr; akzeptierender Endzustand</h3> <p>Siehe Skript von Prof. Dr. Dorothea Wagner, S. 107.</p> <p>Gegeben sei ein Kellerautomat <code>${\cal K}_1 (Q_1, \Sigma, \Gamma_1, \delta_1, q_0^1, Z_0^1, F_1)$</code> der durch leeren STACK akzeptiert. Wir wollen einen neuen Automaten <code>${\cal K}_2 (Q_2, \Sigma, \Gamma_2, \delta_2, q_0^2, Z_0^2, F_2)$</code> der durch akzeptierenden Endzustand akzeptiert. </p> <p><strong>Idee</strong>: Wir legen ein zus&auml;tzliches Symbol <code>$Z_0^2$</code> auf den STACK. Wird <code>$Z_0^2$</code> gelesen, ist der STACK noch nicht leer, aber man kann in einen akzeptierenden Zustand <code>$q_F$</code> wechseln.</p> <p><strong>Formal</strong>: <code>$Q_2 := Q_1 \cup \{q_0^2, q_F\}$</code>, wobei <code>$q_0^2$</code> Anfangszustand von <code>${\cal K}_2$</code> ist und <code>$F_2 := \{q_F\}$</code> <code>$\Gamma_2 := \Gamma_1 \cup \{Z_0^2\}$</code>, wobei <code>$Z_0^2$</code> Initialisierung des STACKS von <code>${\cal K}_2$</code> ist und <code>$\delta_2$</code> festgelegt durch:</p> <p>Zuerst sorgen wir daf&uuml;r, dass <code>$Z_0^2$</code> ganz unten im STACK ist: <code>$\delta_2(q_0^2, a, X) = \begin{cases} \{q_0^1, Z_0^1, Z_0^2\} &amp; \text{falls } a= \varepsilon \text{ und } X = Z_0^2\\ \emptyset &amp; \text{sonst} \end{cases}$</code></p> <p>Dann wie gehabt: <code>$\delta_2(q, a, Z) = \delta_1(q, a, Z) \text{, falls } q \in Q_1, a \in \Sigma \cup \{\varepsilon\} \text{ und } Z \in \Gamma_1$</code></p> <p>Und am Schluss auch akzeptieren: <code>$\delta_2(q, \varepsilon, Z_0^2) = \{(q_F, \varepsilon)\} \text{ f&amp;uuml;r } q \in Q_1$</code>.</p> <h2>Dies und das</h2> <ul> <li>Ein Kellerautomat mit zwei STACKs ist Turingm&auml;chtig. (&rarr; <a href="http://de.wikipedia.org/wiki/Zweikellerautomat" title="Zweikellerautomat">Zweikellerautomat</a>)</li> <li>Ein NPDA erkennt genau die kontextfreien Sprachen.</li> <li>Ein PDA erkennt manche kontextfreie Sprachen, aber nicht alle. (Genauer: <a href="http://de.wikipedia.org/wiki/Deterministisch_kontextfreie_Sprache">Deterministisch kontextfreie Sprache</a>)</li> <li>Zu jedem PDA, der eine Sprache L durch einen akzeptierenden Endzustand akzeptiert, kann ein PDA konstruiert werden, der L mit leerem STACK akzeptiert (und umgekehrt).</li> <li>F&uuml;r jede Grammatik G in Greibach-Normalform gibt es einen PDA.</li> </ul> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Kellerautomat">Kellerautomat</a></li> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/tgi_skript_ws11.pdf">Theoretische Grundlagen der Informatik</a>: Skript von Prof. Dr. Dorothea Wagner, ab S. 105</li> <li><a href="../sprachen-automaten-und-grammatiken/" title="Sprachen, Automaten und Grammatiken: Ein &Uuml;berblick">Sprachen, Automaten und Grammatiken: Ein &Uuml;berblick</a></li> </ul> Komplexitätsklassen in der Informatik: Ein Überblick http://martin-thoma.com/komplexitatsklassen-in-der-informatik-ein-uberblick Thu, 16 Feb 2012 14:51:04 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/komplexitatsklassen-in-der-informatik-ein-uberblick <p>Komplexit&auml;tsklassen werden in der Theoretischen Informatik verwendet um den Ressourcenbedarf von Algorithmen bzw. Problemen einzuordnen. Meist betrachtet man die Laufzeit- und die Speicherplatzkomplexit&auml;t, aber es w&auml;re prinzipiell auf Vorstellbar, dass man andere Kriterien nutzt. Ich werde in diesem Artikel mal kurz die in der Vorlesung behandelten Klassen vorstellen.</p> <p>Da es umst&auml;ndlich ist, werde ich im Folgenden nur noch von Problemen reden. Gemeint sind aber meist auch formale Sprachen und Algorithmen.</p> <h2>Die Klasse P</h2> <p>In der Klasse <code>$\cal P$</code> sind alle Probleme, die mit einer deterministischen Turingmaschine in polynomialzeit l&ouml;sbar sind. Das sind also alle Probleme, f&uuml;r die es einen Algorithmus gibt, der in <code>$\cal O(n^i), i \in \mathbb{N}_0$</code> ist.</p> <p>Wenn es allerdings <em>noch</em> keinen Algorithmus gibt, der ein Problem in polynomialzeit l&ouml;st, kann das Problem dennoch in <code>$\cal P$</code> liegen. Dann muss es einen besseren Algorithmus zur L&ouml;sung des Problems geben.</p> <h2>Die Klasse NP</h2> <p>In der Klasse <code>$\cal NP$</code> sind alle Probleme, die mit einer <strong>nicht-deterministischen</strong> Turingmaschine in polynomialzeit l&ouml;sbar sind. Das besondere an einer nicht-determinisitschen Turingmaschine ist das Orakelmodul. Es liefert einfach die L&ouml;sung. Wie es das macht, wissen wir nicht. Irgendwie geht es halt. Diese L&ouml;sung muss in polynomialzeit von einer deterministischen Turingmaschine verifiziert werden.</p> <p>Was liegt dann nicht in <code>$\cal NP$</code>? Das Orakelmodul h&ouml;rt sich so m&auml;chtig an, dass eventuell alle Probleme in <code>$\cal NP$</code> liegen k&ouml;nnten. Weit gefehlt. Suchprobleme liegen h&auml;ufig (aber nicht immer) au&szlig;erhalb von <code>$\cal NP$</code>. Das sind dann Probleme mit einer Fragestellung &agrave; la &quot;Gib eine optimale Tour durch eine gegebene Menge an St&auml;dten an&quot;. Wenn das Orakel-Modul eine solche Tour liefert, muss der deterministische Teil noch schauen, ob es eventuell eine l&auml;ngere Tour gibt.</p> <p>Die wohl ber&uuml;hmteste Fragestellung der Theoretischen Informatik lautet nun:</p> <p><strong>P vs. NP</strong>: Gibt es Probleme, die in NP liegen, aber nicht in P?</p> <p>Es ist wohl anschaulich klar, dass gilt: <code>$\cal P \subset NP$</code>. P vs. NP ist die Frage, ob <code>$\cal P = NP$</code> oder <code>$\cal P \subsetneq NP$</code>. Oder nochmals anders formuliert: <code>$\cal NP \setminus P \stackrel{?}{=} \emptyset$</code></p> <h3>Die Klasse NPC</h3> <p>Die Klasse der NP-Vollst&auml;ndigen Probleme ist echt in NP, also <code>$\cal NPC \subsetneq NP$</code>. Das besondere an <code>$\cal NPC$</code> ist, dass jedes Probleminstanz in <code>$\cal NP$</code> in eine Instanz eines beliebigen Problems in <code>$\cal NPC$</code> umgewandelt werden kann.</p> <p>Das es ein solches Problem gibt, hat Cook 1971 mit <a href="http://de.wikipedia.org/wiki/Erf%C3%BCllbarkeitsproblem_der_Aussagenlogik">SAT</a> gezeigt. Cook hat also anschaulich folgendes gemacht: <div style="width: 387px" class="wp-caption aligncenter"><a href="../images/2012/02/npc-sat.png"><img src="../images/2012/02/npc-sat.png" alt="" width="387" height="313" class="size-full wp-image-15231"/></a><p class="wp-caption-text"></p></div></p> <p>F&uuml;r alle folgenden Beweise, dass ein Problem in <code>$\cal NPC$</code> liegt, wurde der Satz von Cook verwendet. Laut diesem Satz (dessen Beweis wahnsinning lang ist) l&auml;sst sich jede Probleminstanz von Problemen in <code>$\cal NP$</code> sich in eine Instanz von SAT umwandeln. Es reicht also zu zeigen, dass sich eine beliebige SAT-Instanz I in eine Instanz I&#39; des neuen Problems in polynomialzeit umwandeln l&auml;sst. Diese beiden Instzanzen m&uuml;ssen in folgender Beziehung stehen: F&uuml;r I existiert eine L&ouml;sung <code>$\Leftrightarrow$</code> f&uuml;r I&#39; existiert eine L&ouml;sung: <div style="width: 460px" class="wp-caption aligncenter"><a href="../images/2012/02/proof-new-npc.png"><img src="../images/2012/02/proof-new-npc.png" alt="" width="460" height="354" class="size-full wp-image-15241"/></a><p class="wp-caption-text"></p></div></p> <p>Sobald man von einem Problem sicher wei&szlig;, dass es in <code>$\cal NPC$</code> liegt, kann man nat&uuml;rlich auch etwas anderes als SAT verwenden.</p> <p>Im Bezug auf P vs. NP ist es vor allem interessant. Wenn ein Problem nicht in P, aber in NP liegt, dann ist sicher jedes Problem in NPC au&szlig;erhalb von P. Also: <code>$\cal P \neq NP \Rightarrow P \cap NPC = \emptyset$</code>. Warum? Angenommen es existiert ein Problem P f&uuml;r das gilt: <ul> <li><code>$P \in \cal NP$</code></li> <li><code>$P \notin \cal P$</code></li> <li><code>$P \notin \cal NPC$</code></li> </ul> Dann gibt es eine polynomielle Transformation von jeder Instanz von P in eine Probleminstanz von einem beliebigem Problem in <code>$\cal NPC$</code>. Damit kann jedes Problem in <code>$\cal NPC$</code> nicht mehr in <code>$\cal P$</code> liegen, da sonst auch <code>$P \in \cal P$</code>.</p> <h2>NPI, co-P und co-NP</h2> <p>Formal gilt: <code>$\cal NPI := NP \setminus (P \cup NPC)$</code>. Es sind also alle Probleme, die innerhalb von <code>$\cal NP$</code> sind, aber au&szlig;erhalb von <code>$\cal P$</code> und noch nicht in <code>$\cal NPC$</code> in <code>$\cal NPI$</code>. Es ist also so eine Art &quot;Zwischenklasse&quot;.</p> <p>Um es etwas anschaulicher zu machen, habe ich mal folgendes Bildchen erstellt: <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/02/PvsNP.png"><img src="../images/2012/02/PvsNP.png" alt="" width="500" height="400" class="size-full wp-image-14511"/></a><p class="wp-caption-text"></p></div></p> <p>Bemerkenswert ist folgende Aussage: Im Fall <code>$\cal P = NP$</code> ist auch <code>${\cal P} \setminus \{\emptyset, \Sigma^*\} = {\cal NPC}$</code> (siehe Nachklausur von 2007 / 2008, Frage 5). Warum stimmt das? Damit ein Problem <code>$\in \cal NPC$</code> ist, muss es nur eine polynomielle Transformation von jedem Problem in NP auf das eine Problem geben. Das ist offensichtlich der Fall, wenn man alle Probleme in NP in polynomieller Zeit l&ouml;sen kann. In diesem Fall kann man das Entscheidungsproblem l&ouml;sen und eine Ja-Instanz auf eine beliebige andere Ja-Instanz abbilden und analog Nein-Instanzen auf Nein-Instanzen abbilden. Da <code>$\emptyset$</code> keine Ja-Instanz hat und <code>$\Sigma$</code> keine Nein-Instanz hat, muss man diese herausnehmen.</p> <p>Formal gilt: <code>$\text{co-}{\cal P} := \{L \in \Sigma^* | L^C \in {\cal P}\}$</code> und analog <code>$\text{co-}{\cal NP} := \{L \in \Sigma^* | L^C \in {\cal NP}\}$</code>.</p> <p>Folgende Aussage finde ich dazu sehr interessant: <code>$L \in {\cal NPC} \land L \in \text{co-}{\cal NP} \Rightarrow {\cal NP} = \text{co-}{\cal NP}$</code></p> <h2>D-TAPE und N-TAPE</h2> <p>Im Skript wurde das seltsam geschrieben (<code>$\cal DTAPE$</code>). Ich habe so nicht mehr erkannt, dass es TAPE hei&szlig;en soll. In der Klausur sollte man sich davon nicht irritieren lassen.</p> <p>Formal: <code>$D-TAPE(s(n)) := \{L | \text{Es existiert eine determinitistische TM, die L mit Platzbedarf s(n) akzeptiert.}\}$</code> <code>$N-TAPE(s(n)) := \{L | \text{Es existiert eine nicht-determinitistische TM, die L mit Platzbedarf s(n) akzeptiert.}\}$</code></p> <h2>Quellen und Material</h2> <ul> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/tgi_skript_ws11.pdf">Theoretische Grundlagen der Informatik</a>: Skript von Prof. Dr. Dorothea Wagner</li> <li>Die Bilder stehen hier zur Verf&uuml;gung: <a href='../images/2012/02/komplexitaetsklassen-material.zip'>Material zu den Komplexit&auml;tsklassen</a></li> </ul> Konstruktion der Chomsky-Normalform http://martin-thoma.com/konstruktion-der-chomsky-normalform Sat, 11 Feb 2012 16:25:36 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/konstruktion-der-chomsky-normalform <div class="warning">Dieser Artikel k&ouml;nnte inhaltliche Fehler beinhalten. Bitte lest euch die Kommentare durch.</div> <p>Die Chomsky-Normalform ist eine bestimmte Art, eine kontextfreie Grammatik zu formulieren. Dabei haben nur die Produktionsregeln eine festgelegte Form, alles andere ist wie immer. Die Chomsky-Normalform kommt bei dem CYK-Algorithmus, der das Wortproblem f&uuml;r kontextfreie Grammatiken l&ouml;st, zum Einsatz. Jede kontextfreie Grammatik kann in Chomsky-Normalform gebracht werden.</p> <h2>Die Chomsky-Normalform</h2> <p>Das Besondere an der Chomsky-Normalform ist, dass alle Regeln der Grammatik <code>$G (V, \Sigma, P, S)$</code> folgende Form haben: <code>$A \rightarrow BC$</code> oder <code>$A \rightarrow a$</code>. Dabei sind <code>$A, B, C \in V$</code> und <code>$a \in \Sigma$</code>.</p> <p>Falls die Grammatik in der Lage ist, das Leere Wort <code>$\varepsilon$</code> zu erzeugen, dann f&uuml;gt man folgende Sonderregel hinzu: <code>$S&#39; \rightarrow S | \varepsilon$</code>. Dabei darf S&#39; niemals auf der rechten Seite einer Produktion stehen.</p> <p>Eine Eigenschaft der Chomsky-Normalform ist, dass jedes Wort aus <code>$2 \cdot |w| - 1$</code> Ableitungen gebildet werden kann. (Falls das leere Wort gebildet werden kann sind es <code>$2 \cdot |w|$</code> Ableitungen f&uuml;r jedes nicht-leere Wort und eine Ableitung f&uuml;r das leere Wort) In jedem Ableitungsschritt erh&auml;lt man entweder ein Terminal, oder ein weiteres Nicht-Terminal.</p> <h2>Konstruktion der CNF</h2> <p>Aus einer Grammatik <code>$G (V, \Sigma, P, S)$</code> kann mit folgenden vier Schritten eine Grammatik <code>$G&#39; (V&#39;, \Sigma, P&#39;, S)$</code> in Chomsky-Normalform (CNF) erstellt werden:</p> <h3>Schritt 1</h3> <p>Immer wenn ein Symbol aus <code>$\Sigma$</code> in einer Produktion steht, wird dieses durch <code>$Y_a$</code> ersetzt und eine neue Produktion <code>$Y_a \rightarrow a$</code> zu P&#39; hinzugef&uuml;gt. </p> <p>Es ist somit sichergestellt, dass alle Regeln entweder nur Nicht-Terminale auf der rechten Seite der Produktion stehen haben oder <code>$\varepsilon$</code> oder dass dort ein einzelnes Terminal steht.</p> <h3>Schritt 2</h3> <p>Immer wenn mehr als zwei Variablen auf der rechten Seite stehen, werden diese durch neue ersetzt. Sagen wir es stehen rechts m Variablen. Dann f&uuml;hrt man m - 2 neue Variablen ein, f&uuml;gt diese zu V&#39; hinzu, und macht aus einer Regel <code>$A \rightarrow B_1 B_2 ... B_m$</code> die Regeln <code>$A \rightarrow B_1 C_1, C_1 \rightarrow B_2 C_2, ..., C_{i+1} \rightarrow B_i C_i ... C_{m-2} \rightarrow B_{m-3} C_{m-3}$</code>. </p> <p>An dieser Stelle ist sichergestellt, dass alle Regeln entweder nur ein oder zwei Nicht-Terminale auf der rechten Seite der Produktion stehen haben oder <code>$\varepsilon$</code> oder dass dort ein einzelnes Terminal steht.</p> <h3>Schritt 3</h3> <p>Nun wollen wir alle <code>$\varepsilon$</code>-&Uuml;berg&auml;nge entfernen. </p> <p>Um dies zu erreichen, suchen wir alle Regeln, die nach <code>$\varepsilon$</code> abbilden, also von der Form <code>$A \rightarrow \varepsilon$</code> sind. Dabei streichen wir die Regeln <code>$A \rightarrow \varepsilon$</code>. Falls A nun nicht mehr auf der linken Seite auftaucht, streichen wir es &uuml;berall aus der rechten Seite. Falls dabei eine Regel zu <code>$B \rightarrow \varepsilon$</code> wird, streichen wir auch diese. Das wiederholen wir so lange, bis keine <code>$\varepsilon$</code>-&Uuml;berg&auml;nge mehr vorhanden sind. Am Ende f&uuml;gen wir die Regel <code>$S&#39; \rightarrow S | \varepsilon$</code> hinzu, falls die Grammatik auf das leere Wort abbilden konnte.</p> <p>Nun ist sichergestellt, dass alle Regeln entweder nur ein oder zwei Nicht-Terminale auf der rechten Seite der Produktion stehen haben oder dass dort ein einzelnes Terminal steht. Allerdings kann es noch Kreise in der Ableitung geben, die man entfernen kann.</p> <h3>Schritt 4</h3> <p>In diesem Schritt entfernen wir eventuell vorhandene Kettenregeln, also Regeln der Form <code>$A_1 \rightarrow A_2 \rightarrow A_3 \rightarrow A_u \rightarrow A_1$</code>. Diese findet man mit einer Tiefensuche. Dann ersetzt man alle <code>$A_2, ..., A_u$</code> durch <code>$A_1$</code>. Die Regel <code>$A_1 \rightarrow A_1$</code> kann entfernt werden, da sie ja nichts &auml;ndert.</p> <h2>Beispiele</h2> <h3>Die Sprache der Palindrome</h3> <p>Gegeben sei folgende Grammatik: <code>$G(\underbrace{\{S\}}_{V}, \underbrace{\{a,b\}}_{\Sigma}, S, P)$</code> mit <code>$P = \{S \rightarrow \varepsilon | a | b | aSa | bSb \}$</code>.</p> <h4>Schritt 1</h4> <p><code>$S \rightarrow \varepsilon | Y_a | Y_b | Y_aSY_a | Y_bSY_b$</code> <code>$Y_a \rightarrow a$</code> <code>$Y_b \rightarrow b$</code></p> <h4>Schritt 2</h4> <p><code>$S \rightarrow \varepsilon | Y_a | Y_b | Y_aC_1 | Y_bC_2$</code> <code>$C_1 \rightarrow SY_a$</code> <code>$C_2 \rightarrow SY_b$</code> <code>$Y_a \rightarrow a$</code> <code>$Y_b \rightarrow b$</code></p> <h4>Schritt 3</h4> <p><code>$S \rightarrow Y_a | Y_b | Y_aC_1 | Y_bC_2$</code> <code>$C_1 \rightarrow SY_a$</code> <code>$C_2 \rightarrow SY_b$</code> <code>$Y_a \rightarrow a$</code> <code>$Y_b \rightarrow b$</code> <code>$S&#39; \rightarrow S | \varepsilon$</code></p> <h4>Schritt 4</h4> <p>Keine Kettenregel vorhanden.</p> <h4>Ergebnis</h4> <p>Nun werden noch einzelne Nicht-Terminale durch die m&ouml;glichen Terminale ersetzt und man ist fertig.</p> <p>Damit ist die Grammatik: <code>$G_{CNF} (\{S, S&#39;, Y_a, Y_b, C_1, C_2\}, \{a,b\}, S&#39;, P&#39;))$</code> mit folgenden Produktionen P&#39;: <code>$P&#39; = \{S \rightarrow a | b | Y_aC_1 | Y_bC_2,$</code> <code>$~ C_1 \rightarrow SY_a,$</code> <code>$~ C_2 \rightarrow SY_b,$</code> <code>$~ Y_a \rightarrow a,$</code> <code>$~ Y_b \rightarrow b,$</code> <code>$~ S&#39; \rightarrow S | \varepsilon\}$</code></p> <p>Sie ist also nicht sch&ouml;ner oder einfacher geworden, hat aber eine bestimmte Struktur erhalten.</p> <h2>Weiterf&uuml;hrende Links und Quellen</h2> <ul> <li><a href="http://de.wikipedia.org/wiki/Chomsky-Normalform">Wikipedia</a></li> <li>Uwe Sch&ouml;ning: <i>Theoretische Informatik- kurz gefasst</i>. 5.&nbsp;Auflage. Spektrum Akademischer Verlag, Heidelberg <span style="white-space:nowrap;">2008</span>, ISBN 978-3-8274-1824-1, S.&nbsp;44, <span class="plainlinks-print"><a rel="nofollow" class="external text" href="http://d-nb.info/986529222">DNB 986529222</a></span>.</li> <li>KIT: <ul> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/tgi_skript_ws11.pdf">Skript</a> von Prof. Dr. Dorothea Wagner, S. 98</li> <li><a href="http://i11www.iti.uni-karlsruhe.de/_media/teaching/winter2011/tgi/uebung7.pdf">&Uuml;bung</a> vom 02.02.2012 - Hier ist ein sehr gutes, detailliertes Beispiel! </li> </ul></li> </ul> Minimierung eines Automaten mittels Äquivalenzklassenkonstruktion http://martin-thoma.com/minimierung-eines-automaten-mittels-aquivalenzklassenkonstruktion Fri, 10 Feb 2012 21:18:38 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/minimierung-eines-automaten-mittels-aquivalenzklassenkonstruktion <p>Wenn ein Endlicher Automat gegeben ist, kann durch die Konstruktion von &Auml;quivalenzklassen sehr einfach ein Automat mit gleichem Akzeptanzverhalten und minimaler Anzahl an Zust&auml;nden gefunden werden. Daf&uuml;r ben&ouml;tigt man im Wesentlichen sogar nur drei Schritte.</p> <h2>Der Algorithmus</h2> <ol> <li><strong>&Uuml;berfl&uuml;ssige Zust&auml;nde streichen</strong>: Manche Zust&auml;nde sind nicht erreichbar. Diese k&ouml;nnen offensichtlich gestrichen werden.</li> <li><strong>Akzeptierende von nichtakzeptierenden Zust&auml;nden trennen</strong>: Alle akzeptierenden Zust&auml;nde werden in eine &Auml;quivalenzklasse gepackt, alle Zust&auml;nde die nicht akzeptieren kommen in eine andere Klasse.</li> <li><strong>Zust&auml;nde trennen</strong>: F&uuml;r jedes Zeichen des Eingabealphabets `$\Sigma$` schreibt man sich auf, in welchen Zustand der Zustand f&uuml;hrt. Wenn zwei Zust&auml;nde in verschiedene Klassen f&uuml;hren, werden diese getrennt. Dies wiederholt man so lange, bis man ein mal alle Zeichen aus `$\Sigma$` durchgegangen ist, ohne dass Zust&auml;nde getrennt wurden.</li> </ol> <h2>Beispiel</h2> <p>Gegeben sei folgender Endlicher Automat A: <code>$A = (\{0,1\}, \{S, A, B, C, D, E, F, G, H, I\}, S, \sigma, \{D\})$</code> mit folgender &Uuml;bergangsfunktion <code>$\sigma$</code>: <div style="width: 392px" class="wp-caption aligncenter"><a href="../images/2012/02/endlicher-automat-gross.png"><img src="../images/2012/02/endlicher-automat-gross.png" alt="" width="392" height="389" class="size-full wp-image-13451"/></a><p class="wp-caption-text"></p></div></p> <p>Es ist offensichtlich, dass I nicht erreicht werden kann. Da der Graph gerichtet ist, kann man schnell sehen, dass auch H und G nicht erreicht werden k&ouml;nnen. Algorithmisch kann man diese Zust&auml;nde durch eine Tiefensuche bestimmen.</p> <p>Nach Schritt 1 haben wir also den Automaten <code>$A_1 = (\{0,1\}, \{S, A, B, C, D, E, F\}, S, \sigma, \{D\})$</code>: <div style="width: 340px" class="wp-caption aligncenter"><a href="../images/2012/02/endlicher-automat-kleiner.png"><img src="../images/2012/02/endlicher-automat-kleiner.png" alt="" width="340" height="381" class="size-full wp-image-13471"/></a><p class="wp-caption-text"></p></div></p> <p>In Schritt 2 erstellen wir also zuerst eine &Auml;quivalenzklasse der Zust&auml;nde: <code>$\{S, A, B, C, D, E, F\}$</code>.</p> <p>Die akzeptierenden Zust&auml;nde werden von den nicht akzeptierenden getrennt: <code>$\{D\}, \{S, A, B, C, E, F\}$</code></p> <p>In Schritt 3 gehen wir nun immer wieder die Zeichen &quot;0&quot; und &quot;1&quot; aus <code>$\Sigma$</code> durch: In welche Klassen f&uuml;hrt &quot;0&quot;? <a href="../images/2012/02/aequivalenzklassen-1.png"><img src="../images/2012/02/aequivalenzklassen-1.png" alt="&Auml;quivalenzklassen - Schritt 1" title="&Auml;quivalenzklassen - Schritt 1" width="220" height="71" class="aligncenter size-full wp-image-13631" /></a></p> <p>C wird also von <code>$\{S, A, B, E, F\}$</code> getrennt. Wir haben folgende Klassen: <code>$\{C\}, \{D\}, \{S, A, B, E, F\}$</code></p> <p>&quot;1&quot; trennt nun &quot;A&quot; von <code>$\{S, B, E, F\}$</code>: <a href="../images/2012/02/aequivalenzklasse-2.png"><img src="../images/2012/02/aequivalenzklasse-2.png" alt="&Auml;quivalenzklassen - Schritt 2" title="&Auml;quivalenzklassen - Schritt 2" width="246" height="66" class="aligncenter size-full wp-image-13661" /></a></p> <p>&quot;0&quot; trennt nun &quot;S&quot; von <code>$\{B, E, F\}$</code>: <a href="../images/2012/02/aequivalenzklasse-3.png"><img src="../images/2012/02/aequivalenzklasse-3.png" alt="&Auml;quivalenzklassen - Schritt 3" title="&Auml;quivalenzklassen - Schritt 3" width="267" height="65" class="aligncenter size-full wp-image-13681" /></a></p> <p>Wir haben nun die &Auml;quivalenzklassen <code>$\{S\}, \{A\}, \{C\}, \{D\}, \{B, E, F\}$</code>.</p> <p>Im n&auml;chsten Schritt sehen wir, dass &quot;1&quot; nicht mehr trennt und &quot;0&quot; auch nicht nochmals etwas trennt. Wir sind also fertig. Die Zust&auml;nde B, E und F k&ouml;nnen zu einem zusammengefasst werden. Ich nenne ihn mal T (f&uuml;r Trash, da man in diesem Zustand niemals mehr akzeptieren kann). Damit ist unser minimaler Endlicher Automat folgender:</p> <p><a href="../images/2012/02/endlicher-automat-minimal.png"><img src="../images/2012/02/endlicher-automat-minimal.png" alt="Minimaler Endlicher Automat" title="Minimaler Endlicher Automat" width="346" height="278" class="aligncenter size-full wp-image-13711" /></a></p> <h2>LaTeX</h2> <p>Das ist der LaTeX-Code f&uuml;r die Automaten:</p> <div class="highlight"><pre><code class="python">\<span class="n">documentclass</span><span class="p">{</span><span class="n">scrartcl</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">amsmath</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">tikz</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">pst</span><span class="o">-</span><span class="n">node</span><span class="p">}</span> \<span class="n">usetikzlibrary</span><span class="p">{</span><span class="n">arrows</span><span class="p">,</span><span class="n">automata</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">&gt;=</span><span class="n">stealth</span><span class="s">&#39;,shorten &gt;=1pt,auto,node distance=2cm]</span> \<span class="n">node</span><span class="p">[</span><span class="n">initial</span><span class="p">,</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$S$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">,</span> <span class="n">left</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$A$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$B$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$C$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">,</span><span class="n">accepting</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="p">[</span><span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$D$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">C</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$E$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">B</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$F$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="p">[</span><span class="n">left</span> <span class="n">of</span><span class="o">=</span><span class="n">B</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$G$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">H</span><span class="p">)</span> <span class="p">[</span><span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$H$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="p">[</span><span class="n">left</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$I$`</span><span class="p">};</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">A</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">C</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">F</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">D</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">E</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">S</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">right</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">E</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">left</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">F</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">F</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">H</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">S</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">above</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">I</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> <span class="n">Ueberfluessige</span> <span class="n">weg</span><span class="p">:</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">&gt;=</span><span class="n">stealth</span><span class="s">&#39;,shorten &gt;=1pt,auto,node distance=2cm]</span> \<span class="n">node</span><span class="p">[</span><span class="n">initial</span><span class="p">,</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$S$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">,</span> <span class="n">left</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$A$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$B$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$C$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">,</span><span class="n">accepting</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="p">[</span><span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$D$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">C</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$E$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">B</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$F$`</span><span class="p">};</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">A</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">C</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">F</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">D</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">E</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">S</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">right</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">E</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">left</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">F</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> <span class="n">Minimal</span><span class="p">:</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="o">&gt;=</span><span class="n">stealth</span><span class="s">&#39;,shorten &gt;=1pt,auto,node distance=2cm]</span> \<span class="n">node</span><span class="p">[</span><span class="n">initial</span><span class="p">,</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="p">{</span><span class="sb">`$S$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">,</span> <span class="n">left</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$A$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$T$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="p">[</span><span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$C$`</span><span class="p">};</span> \<span class="n">node</span><span class="p">[</span><span class="n">state</span><span class="p">,</span><span class="n">accepting</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="p">[</span><span class="n">right</span> <span class="n">of</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">below</span> <span class="n">of</span><span class="o">=</span><span class="n">S</span><span class="p">]</span> <span class="p">{</span><span class="sb">`$D$`</span><span class="p">};</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">S</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">A</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">C</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="n">edge</span> <span class="p">[</span><span class="n">loop</span> <span class="n">left</span><span class="p">]</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span> <span class="p">(</span><span class="n">D</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">B</span><span class="p">);</span> \<span class="n">path</span><span class="p">[</span><span class="o">-&gt;</span><span class="p">]</span> <span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="n">edge</span> <span class="n">node</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">}</span> <span class="p">(</span><span class="n">S</span><span class="p">);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> </code></pre></div> <p>Und hier die Bilder mit den Pfeilchen:</p> <div class="highlight"><pre><code class="python">\<span class="n">documentclass</span><span class="p">{</span><span class="n">article</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">amsmath</span><span class="p">}</span> \<span class="n">usepackage</span><span class="p">{</span><span class="n">tikz</span><span class="p">}</span> \<span class="n">usetikzlibrary</span><span class="p">{</span><span class="n">calc</span><span class="p">,</span><span class="n">shapes</span><span class="p">}</span> \<span class="n">newcommand</span><span class="p">{</span>\<span class="n">tikzmark</span><span class="p">}[</span><span class="mi">1</span><span class="p">]{</span>\<span class="n">tikz</span><span class="p">[</span><span class="n">overlay</span><span class="p">,</span><span class="n">remember</span> <span class="n">picture</span><span class="p">]</span> \<span class="n">node</span> <span class="p">(</span><span class="c">#1) {};}</span> \<span class="n">newcommand</span><span class="p">{</span>\<span class="n">DrawBoxi</span><span class="p">}[</span><span class="mi">5</span><span class="p">]{</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="n">overlay</span><span class="p">,</span><span class="n">remember</span> <span class="n">picture</span><span class="p">,</span><span class="o">-</span><span class="n">latex</span><span class="p">,</span><span class="n">shorten</span> <span class="o">&gt;=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="n">shorten</span> <span class="o">&lt;=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="n">out</span><span class="o">=</span><span class="mi">70</span><span class="p">,</span><span class="ow">in</span><span class="o">=</span><span class="mi">130</span><span class="p">]</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.9</span><span class="n">cm</span><span class="p">,</span><span class="c">#1] (s.north) to (a.north);</span> <span class="o">%</span>\<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.45</span><span class="n">cm</span><span class="p">,</span><span class="c">#2] (a.north) to (b.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.7</span><span class="n">cm</span><span class="p">,</span> <span class="c">#3] (b.north) to (f.north);</span> <span class="o">%</span>\<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">1.1</span><span class="n">cm</span><span class="p">,</span> <span class="c">#4] (c.north) to (d.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.45</span><span class="n">cm</span><span class="p">,</span><span class="c">#5] (e.north) to (e.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.45</span><span class="n">cm</span><span class="p">,</span><span class="c">#5] (f.north) to (f.north);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> <span class="p">}</span> \<span class="n">newcommand</span><span class="p">{</span>\<span class="n">DrawBoxii</span><span class="p">}[</span><span class="mi">5</span><span class="p">]{</span> \<span class="n">begin</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}[</span><span class="n">overlay</span><span class="p">,</span><span class="n">remember</span> <span class="n">picture</span><span class="p">,</span><span class="o">-</span><span class="n">latex</span><span class="p">,</span><span class="n">shorten</span> <span class="o">&gt;=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="n">shorten</span> <span class="o">&lt;=</span><span class="mi">5</span><span class="n">pt</span><span class="p">,</span><span class="n">out</span><span class="o">=</span><span class="mi">70</span><span class="p">,</span><span class="ow">in</span><span class="o">=</span><span class="mi">130</span><span class="p">]</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.45</span><span class="n">cm</span><span class="p">,</span><span class="c">#1] (s.north) to (a.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.8</span><span class="n">cm</span><span class="p">,</span><span class="c">#2] (a.north) to (c.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.9</span><span class="n">cm</span><span class="p">,</span> <span class="c">#3] (b.north) to (f.north);</span> \<span class="n">draw</span><span class="p">[</span><span class="n">distance</span><span class="o">=</span><span class="mf">0.45</span><span class="n">cm</span><span class="p">,</span><span class="c">#5] (e.north) to (e.north);</span> \<span class="n">end</span><span class="p">{</span><span class="n">tikzpicture</span><span class="p">}</span> <span class="p">}</span> \<span class="n">begin</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> <span class="n">Schritt</span> <span class="mi">3</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">:</span> \<span class="n">begin</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> <span class="o">%</span>\<span class="p">{</span><span class="n">D</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">d</span><span class="p">}</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span><span class="n">S</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">s</span><span class="p">},</span> <span class="n">A</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">a</span><span class="p">},</span> <span class="n">B</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">b</span><span class="p">},</span> <span class="n">C</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">c</span><span class="p">},</span> <span class="n">E</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">e</span><span class="p">},</span> <span class="n">F</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">f</span><span class="p">}</span>\<span class="p">}</span> \<span class="n">DrawBoxi</span><span class="p">{</span><span class="n">red</span><span class="p">}{</span><span class="n">blue</span><span class="p">}{</span><span class="n">green</span><span class="p">}{</span><span class="n">purple</span><span class="p">}{</span><span class="n">orange</span><span class="p">}</span>\\ \<span class="n">end</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> <span class="n">Schritt</span> <span class="mi">3</span> <span class="o">-</span> <span class="mf">1.1</span><span class="p">:</span> \<span class="n">begin</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> <span class="o">%</span>\<span class="p">{</span><span class="n">C</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">c</span><span class="p">}</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span><span class="n">D</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">d</span><span class="p">}</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span><span class="n">S</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">s</span><span class="p">},</span> \<span class="n">tikzmark</span><span class="p">{</span><span class="n">a</span><span class="p">}</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">b</span><span class="p">},</span> <span class="n">E</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">e</span><span class="p">},</span> <span class="n">F</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">f</span><span class="p">}</span>\<span class="p">}</span> \<span class="n">DrawBoxii</span><span class="p">{</span><span class="n">red</span><span class="p">}{</span><span class="n">blue</span><span class="p">}{</span><span class="n">green</span><span class="p">}{</span><span class="n">purple</span><span class="p">}{</span><span class="n">orange</span><span class="p">}</span>\\ \<span class="n">end</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> <span class="n">Schritt</span> <span class="mi">3</span> <span class="o">-</span> <span class="mf">2.0</span><span class="p">:</span> \<span class="n">begin</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> \<span class="p">{</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">a</span><span class="p">}</span><span class="n">A</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span><span class="n">C</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">c</span><span class="p">}</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span><span class="n">D</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">d</span><span class="p">}</span>\<span class="p">}</span> <span class="o">~</span> \<span class="p">{</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">s</span><span class="p">}</span><span class="n">S</span><span class="p">,</span> \<span class="n">tikzmark</span><span class="p">{</span><span class="n">b</span><span class="p">}</span><span class="n">B</span><span class="p">,</span> <span class="n">E</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">e</span><span class="p">},</span> <span class="n">F</span>\<span class="n">tikzmark</span><span class="p">{</span><span class="n">f</span><span class="p">}</span>\<span class="p">}</span> \<span class="n">DrawBoxi</span><span class="p">{</span><span class="n">red</span><span class="p">}{</span><span class="n">blue</span><span class="p">}{</span><span class="n">green</span><span class="p">}{</span><span class="n">purple</span><span class="p">}{</span><span class="n">orange</span><span class="p">}</span>\\ \<span class="n">end</span><span class="p">{</span><span class="n">gather</span><span class="o">*</span><span class="p">}</span> \<span class="n">end</span><span class="p">{</span><span class="n">document</span><span class="p">}</span> </code></pre></div> Linux Memory Consumption http://martin-thoma.com/linux-memory-consumption Fri, 10 Feb 2012 20:04:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/linux-memory-consumption <h2>free</h2> <p>I&#39;ve you want to check your memory consumption on a Linux machine, you can use free.</p> <div class="highlight"><pre><code class="bash">moose@pc07:~<span class="sb">`</span><span class="nv">$ </span>free -m total used free shared buffers cached Mem: 3952 2832 1119 0 117 1565 -/+ buffers/cache: 1150 2802 Swap: 8656 0 8656 </code></pre></div> <p>This means: I have a total of 3952 MB <a href="http://en.wikipedia.org/wiki/Random-access_memory">RAM</a>, used and free should be clear, shared is memory which is shared between processes, e.g. shared libraries. The &quot;buffers&quot; entry tells you how much of your RAM is being used for disk buffering. Over 8 GB got swapped out.</p> <h2>top</h2> <p>top will give you something like Windows&#39; task manager in the command line. If you press &quot;M&quot; it gets sorted by memory utilization:</p> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2012/02/top-memory.png"><img src="../images/2012/02/top-memory.png" alt="" width="500" height="497" class="size-full wp-image-13591"/></a><p class="wp-caption-text"></p></div> <h2>pmap</h2> <p>pmap reports a memory map of a process. Lets make an example. Eclipse has the process ID (pid) 4526 at the moment.</p> <div class="highlight"><pre><code class="bash">pmap 4526 </code></pre></div> <p>gives the following output:</p> <div class="highlight"><pre><code class="bash">4526: /usr/lib/eclipse/eclipse Address Kbytes Mode Offset Device Mapping 08048000 16 r-x-- 0000000000000000 008:00001 eclipse 0804c000 4 r---- 0000000000003000 008:00001 eclipse 0804d000 4 rw--- 0000000000004000 008:00001 eclipse 096c4000 11608 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 62e40000 43776 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 65900000 130944 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 6d8e0000 87424 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 72e40000 262144 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 82e40000 44800 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 85a00000 512 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 85a80000 216832 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 92e40000 6312 r--s- 0000000000001000 008:00001 classes.jsa 9346a000 3928 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 93840000 7412 rw--- 000000000062b000 008:00001 classes.jsa 93f7d000 4876 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 94440000 904 rw--- 0000000000d68000 008:00001 classes.jsa 94522000 3192 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> 94840000 32 r-xs- 0000000000e4a000 008:00001 classes.jsa 94848000 4064 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b17f5000 44 r--s- 0000000000070000 008:00001 org.eclipse.jdt.junit_3.5.2.r352_v20100113-0800.jar b1800000 144 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b1824000 880 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b1909000 12 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b190c000 312 rwx-- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b195a000 12 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b195d000 312 rwx-- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b19ab000 12 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b19ae000 312 rwx-- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b19fc000 12 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b19ff000 312 rwx-- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b1a4d000 16 r-x-- 0000000000000000 008:00001 libattr.so.1.1.0 b1a51000 4 r---- 0000000000003000 008:00001 libattr.so.1.1.0 b1a52000 4 rw--- 0000000000004000 008:00001 libattr.so.1.1.0 b1a53000 24 r-x-- 0000000000000000 008:00001 libfam.so.0.0.0 b1a59000 4 r---- 0000000000006000 008:00001 libfam.so.0.0.0 b1a5a000 4 rw--- 0000000000007000 008:00001 libfam.so.0.0.0 b1a5b000 24 r-x-- 0000000000000000 008:00001 libacl.so.1.1.0 b1a61000 4 r---- 0000000000006000 008:00001 libacl.so.1.1.0 b1a62000 4 rw--- 0000000000007000 008:00001 libacl.so.1.1.0 b1a63000 48 r-x-- 0000000000000000 008:00001 libfile.so b1a6f000 4 r---- 000000000000b000 008:00001 libfile.so b1a70000 4 rw--- 000000000000c000 008:00001 libfile.so b1a71000 100 r--s- 0000000000000000 008:00001 mime.cache b1a8a000 12 r-x-- 0000000000000000 008:00001 libgpg-error.so.0.4.0 b1a8d000 4 r---- 0000000000002000 008:00001 libgpg-error.so.0.4.0 <span class="o">[</span>...<span class="o">]</span> b755a000 4 r--s- 0000000000001000 008:00001 runtime_registry_compatibility.jar b755b000 4 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b755c000 28 r-x-- 0000000000000000 008:00001 libvorbisfile.so.3.3.2 b7563000 4 r---- 0000000000006000 008:00001 libvorbisfile.so.3.3.2 b7564000 4 rw--- 0000000000007000 008:00001 libvorbisfile.so.3.3.2 b7565000 16 r-x-- 0000000000000000 008:00001 libcanberra-gtk-module.so b7569000 4 ----- 0000000000004000 008:00001 libcanberra-gtk-module.so b756a000 4 r---- 0000000000004000 008:00001 libcanberra-gtk-module.so b756b000 4 rw--- 0000000000005000 008:00001 libcanberra-gtk-module.so b756c000 44 r-x-- 0000000000000000 008:00001 eclipse_1208.so b7577000 4 r---- 000000000000a000 008:00001 eclipse_1208.so b7578000 4 rw--- 000000000000b000 008:00001 eclipse_1208.so b7579000 252 r---- 0000000000000000 008:00001 LC_CTYPE b75b8000 1144 r---- 0000000000000000 008:00001 LC_COLLATE b76d6000 4 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b76d7000 1356 r-x-- 0000000000000000 008:00001 libc-2.11.1.so b782a000 4 ----- 0000000000153000 008:00001 libc-2.11.1.so b782b000 8 r---- 0000000000153000 008:00001 libc-2.11.1.so b782d000 4 rw--- 0000000000155000 008:00001 libc-2.11.1.so b782e000 16 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b7832000 8 r-x-- 0000000000000000 008:00001 libdl-2.11.1.so b7834000 4 r---- 0000000000001000 008:00001 libdl-2.11.1.so b7835000 4 rw--- 0000000000002000 008:00001 libdl-2.11.1.so b7836000 84 r-x-- 0000000000000000 008:00001 libpthread-2.11.1.so b784b000 4 r---- 0000000000014000 008:00001 libpthread-2.11.1.so b784c000 4 rw--- 0000000000015000 008:00001 libpthread-2.11.1.so b784d000 8 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b784f000 4 r---- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b7850000 4 r---- 0000000000000000 008:00001 LC_NUMERIC b7851000 4 r---- 0000000000000000 008:00001 LC_TIME b7852000 4 r---- 0000000000000000 008:00001 LC_MONETARY b7853000 4 r---- 0000000000000000 008:00001 SYS_LC_MESSAGES b7854000 4 r---- 0000000000000000 008:00001 LC_PAPER b7855000 4 r---- 0000000000000000 008:00001 LC_NAME b7856000 4 r---- 0000000000000000 008:00001 LC_ADDRESS b7857000 4 r---- 0000000000000000 008:00001 LC_TELEPHONE b7858000 4 r---- 0000000000000000 008:00001 LC_MEASUREMENT b7859000 28 r--s- 0000000000000000 008:00001 gconv-modules.cache b7860000 4 r---- 0000000000000000 008:00001 LC_IDENTIFICATION b7861000 8 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b7863000 4 r-x-- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> b7864000 108 r-x-- 0000000000000000 008:00001 ld-2.11.1.so b787f000 4 r---- 000000000001a000 008:00001 ld-2.11.1.so b7880000 4 rw--- 000000000001b000 008:00001 ld-2.11.1.so bfa49000 12 ----- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> bfa4d000 304 rwx-- 0000000000000000 000:00000 <span class="o">[</span> stack <span class="o">]</span> bfa99000 4 rw--- 0000000000000000 000:00000 <span class="o">[</span> anon <span class="o">]</span> mapped: 927836K writeable/private: 881752K shared: 13572K </code></pre></div> <p>So at the moment eclipse is using 927MB of virtual memory. But it need &quot;only&quot; about 186 MB real, physical memory. According to <a href="http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html">virtualthreads.blogspot.com</a> all data segments have the access rights rw--- and all code segments have the rights r-x--.</p> <h2>vmstat</h2> <p>Virtual memory statistics gives you the following information:</p> <p>Here is the example:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~<span class="nv">$`</span> vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 1120696 119948 1599112 0 0 21 35 416 116 12 5 82 1 </code></pre></div> <p>--memory-- <strong>swpd</strong>: sum of the used virtual memory. <strong>free</strong>: amount of unused physical memory. <strong>buff</strong>: amount of physical memory which gets used as disc-buffer. <strong>cache</strong>: amount of physical memory which gets used as cache. --swap-- <strong>si</strong>: amount of memory which gets loaded from hdd to your RAM. If this is positive, you need more RAM. <strong>so</strong>: amount of memory which gets loaded from RAM to hdd. --io-- <strong>bi</strong>: input of block devices <strong>bo</strong>: output of block devices --system-- <strong>in</strong>: Number of interrupts per second <strong>cs</strong>: Context-switches per second --cpu-- <strong>us</strong>: CPU time spent for user processes <strong>sy</strong>: CPU time spent for kernel processes <strong>id</strong>: idle processor time <strong>wa</strong>: Waiting for input / output</p> <h2>Sources</h2> <ul> <li><a href="http://linuxwiki.de/vmstat">LinuxWiki</a> (German)</li> <li><a href="http://www.cyberciti.biz/faq/linux-check-memory-usage/">cyberciti.biz</a></li> </ul> Wahrscheinlichkeitstheorie - Klausur http://martin-thoma.com/wt-klausur Tue, 07 Feb 2012 15:29:52 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wt-klausur <p>Morgen schreibe ich eine Klausur in Wahrscheinlichkeitstheorie. Zum Gl&uuml;ck d&uuml;rfen wir das Skript und Notizen mitnehmen. </p> <p>Diesen netten, kleinen <a href='../images/2012/02/wt-cheat-sheet.pdf'>Zettel mit Formeln</a> habe ich gerade erstellt. Falls ihr die LaTeX-Datei anpassen wollt, k&ouml;nnt ihr sie <a href='../images/2012/02/wt-cheat-sheet.zip'>hier</a> herunterladen.</p> <p><a href="http://www.math.kit.edu/stoch/lehre/wtinf2011w">Hier</a> noch ein paar Hinweise:</p> <p>Klausur Informatik: 08. Februar 2012, <strong>17.45 &ndash; 19.15 Uhr</strong>. <ul> <li>Teilnehmer mit Nachnamen <strong>Aa -- Kon</strong> schreiben die Klausur im Audimax, Geb. 30.95 </li> <li>Teilnehmer mit Nachnamen <strong>Kor -- Zz</strong> schreiben die Klausur im Gerthsen-H&ouml;rsaal, Geb. 30.21 </li> </ul></p> <h2>Nicht vergessen:</h2> <ul> <li>Skript + Mitschrift</li> <li>Studentenausweis</li> <li>Taschenrechner</li> <li>Kugelschreiber</li> </ul> Stop ACTA http://martin-thoma.com/stop-acta Sat, 28 Jan 2012 20:19:39 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/stop-acta <div style="width: 128px" class="wp-caption alignright"><a href="../images/2012/01/acta-krake.png"><img src="../images/2012/01/acta-krake.png" alt="" width="128" height="128" class="size-full wp-image-13091"/></a><p class="wp-caption-text"></p></div> <h2>What is ACTA?</h2> <p>The Anti-Counterfeiting Trade Agreement (ACTA) is a trade agreement between the following states: <ul> <li>United States: signed 1 October 2011 in Tokyo</li> <li>Australia: signed 1 October 2011 in Tokyo</li> <li>Canada: signed 1 October 2011 in Tokyo</li> <li>Japan: signed 1 October 2011 in Tokyo</li> <li>Morocco: signed 1 October 2011 in Tokyo</li> <li>New Zealand: signed 1 October 2011 in Tokyo</li> <li>Singapore: signed 1 October 2011 in Tokyo</li> <li>South Korea: signed 1 October 2011 in Tokyo</li> <li>European Union and 22 Member States: signed on 26 January 2012; final enactment into law is on hold pending a debate in the European Parliament in June 2012. <ul> <li>Germany: not signed yet</li> <li>Cyprus: not signed yet</li> <li>Estonia: not signed yet</li> <li>Netherlands: not signed yet</li> <li>Slovakia: not signed yet</li> </ul> </li> <li>Mexico: </li> <li>Switzerland: </li> </ul></p> <p>Those countries describe it as a response &quot;to the increase in global trade of counterfeit goods and pirated copyright protected works.&quot; It would create a governing body outside international institutions such as the World Trade Organization (WTO), the World Intellectual Property Organization (WIPO) or the United Nations. The scope of ACTA includes counterfeit goods, generic medicines and copyright infringement on the Internet.</p> <p>An official Summary of Key Elements Under Discussion published November 2009 states that &quot;ACTA aims to build on existing international rules in the area of intellectual property, in particular on the TRIPS Agreement, and is intended to address a number of enforcement issues where participants have identified that an international legal framework does not exist or needs to be strengthened.&quot;</p> <p>On 10 March 2010, the European Parliament adopted a resolution criticizing the ACTA with 663 in favor of the resolution and 13 against, arguing that &quot;in order to respect fundamental rights, such as the right to freedom of expression and the right to privacy&quot; certain changes in the ACTA content and the process should be made.</p> <h2>Who is for ACTA?</h2> <p>Well, I guess the signing government and parliaments. I&#39;ve also heard that <a href="http://en.wikipedia.org/wiki/MPAA">MPAA</a> is for ACTA (<a href="http://www.mpaa.org/resources/eea2c91a-7608-4b3a-9305-ec414c47b67f.pdf">source</a>).</p> <h2>Who is against ACTA?</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Electronic_Frontier_Foundation">Electronic Frontier Foundation</a> (EFF)</li> <li><a href="http://en.wikipedia.org/wiki/Chaos_Computer_Club">Chaos Computer Club</a></li> <li>several pirate partys, e.g. the German Piratenpartei (<a href="http://web.piratenpartei.de/papiere/2010/acta">source</a>)</li> </ul> <h3>And why?</h3> <iframe width="560" height="315" src="http://www.youtube.com/embed/citzRjwk-sQ" frameborder="0" allowfullscreen></iframe> <ul> <li>treaty will restrict fundamental civil and digital rights: <ul> <li>freedom of expression</li> <li>communication privacy</li> </ul> </li> <li>removal of "legal safeguards that protect Internet Service Providers from liability for the actions of their subscribers" in effect giving ISPs no option but to comply with privacy invasions</li> </ul> <h2>See also</h2> <ul> <li>Wikpedia: <a href="http://en.wikipedia.org/wiki/Anti-Counterfeiting_Trade_Agreement">ACTA</a> (big parts of my article are from this wiki-article)</li> <li><a href="http://freeknowledge.eu/acta-a-global-threat-to-freedoms-open-letter">open letter 1</a></li> <li><a href="http://www.avaaz.org/de/eu_save_the_internet_spread/?wabjtbb">Save the Internet</a></li> <li><a href="http://www.stopp-acta.info/">STOPP ACTA</a></li> <li><a href="http://www.thejournal.ie/french-mep-quits-and-slams-acta-process-as-a-charade-338453-Jan2012/">French MEP quits and slams ACTA process as &lsquo;a charade&rsquo;</a></li> </ul> Sprachen, Automaten und Grammatiken: Ein Überblick http://martin-thoma.com/sprachen-automaten-und-grammatiken Sat, 28 Jan 2012 09:52:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sprachen-automaten-und-grammatiken <p>Die folgende Tabelle gibt einen Überblick über formale Sprachen, die Automaten die sie akzeptieren und die Grammatiken, die sie erzeugen. Dabei haben die Grammatiken die Form <code>$G = (V, \Sigma, P, S)$</code>: <ul> <li>V: Die Menge der Nicht-Terminale. Für sie benutze ich Gro&szlig;buchstaben.</li> <li><code>$\Sigma$</code>: Die Menge der Terminale. Für sie benutze ich Kleinbuchstaben.</li> <li>P: Die Produktion, also die Regeln mit denen die Grammatik die Sprache erzeugt. Nur diese hat unterschiedliche Bedingungen, je nach dem welchem Typ die Grammatik angeh&ouml;rt.</li> <li>S: Das Startsymbol aus <code>$\Sigma$</code>.</li> </ul></p> <table> <tr> <th rowspan="2">Typ</td> <th rowspan="2">Bezeichnung</td> <th rowspan="2">Regeln</td> <th colspan="4">Abgeschlossen unter</td> <th rowspan="2">Modell</td> </tr> <tr> <th>`$\cup$`</th> <th>`$\cap$`</th> <th>`$\cdot$`</th> <th>`${}^C$`</th> </tr> <tr> <td style="background-color:#F08080;">0</td> <td>semientscheidbar</td> <td>alles</td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></td> <td>D. <a href="http://de.wikipedia.org/wiki/Turingmaschine">Turingmaschine</a>, ND. Turingmaschine</td> </tr> <tr> <td style="background-color:#90EE90;">1</td> <td><a href="http://de.wikipedia.org/wiki/Kontextsensitive_Grammatik">kontextsensitiv</a></td> <td>`$u \rightarrow v, |a| \leq |v|$`</td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td>(ND.?) L&auml;ngenbeschr&auml;nkter Automat</td> </tr> <tr> <td style="background-color:#90EE90;">2</td> <td><a href="http://de.wikipedia.org/wiki/Kontextfreie_Grammatik">kontextfrei</a></td> <td>`$A \rightarrow v$`</td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/no.png" alt="no" title="no" width="13" height="13" class="alignnone size-full wp-image-12961" /></td> <td>ND. <a href="http://de.wikipedia.org/wiki/Kellerautomat">Kellerautomat</a></td> </tr> <tr> <td style="background-color:#90EE90;">3</td> <td><a href="http://de.wikipedia.org/wiki/Regul%C3%A4re_Grammatik">regul&auml;r</a></td> <td>`$A \rightarrow \varepsilon, A \rightarrow aB$`</td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><img src="../images/2012/01/yes.png" alt="yes" title="yes" width="13" height="13" class="size-full wp-image-12931" /></td> <td><a href="http://de.wikipedia.org/wiki/Endlicher_Automat">Endliche Automaten</a> (<a href="http://de.wikipedia.org/wiki/Moore-Automat">Moore</a>, <a href="http://de.wikipedia.org/wiki/Mealy-Automat">Mealy</a>, <a href="http://de.wikipedia.org/wiki/Akzeptor_(Informatik)">Akzeptoren</a>)</td> </tr> </table> <p><strong>Legende:</strong> Typ.: Der Typ der Grammatik in der <a href="http://de.wikipedia.org/wiki/Chomsky-Hierarchie">Chomsky-Hierarchie</a> D.: &quot;Deterministisch&quot; ND.: &quot;Nicht Deterministisch&quot; <span style="background-color:#F08080;">semi-entscheidbar</span> <span style="background-color:#90EE90;">entscheidbar</span>, es kann also in endlicher Zeit entschieden werden, ob ein Wort in der Sprache liegt (vgl. <a href="http://de.wikipedia.org/wiki/Wortproblem">Wortproblem</a>).</p> <p><strong>Nicht-Abeschlossenheit der Kontextfreien Sprachen:</strong> <code>$L_1 = \{a^jb^ic^i | j \in \mathbb{N}_0, i \in \mathbb{N}_0\}$</code> <code>$L_2 = \{a^ib^ic^j | j \in \mathbb{N}_0, i \in \mathbb{N}_0\}$</code> <code>$L_1 \cap L_2 = \{a^ib^ic^i | i \in \mathbb{N}_0\}$</code> <code>$(L_1 \cup L_2)^C = L_1^C \cap L_2^C$</code></p> <h2>Weitere Aussagen</h2> <p>Sei L eine Sprache. <code>$L \in {\cal L_3} \Leftrightarrow$</code> Es existiert ein regul&auml;rer Ausdruck für L. <code>$L \in {\cal L_3} \Leftrightarrow$</code> Die Anzahl der &Auml;quivalenzklassen der <a href="http://de.wikipedia.org/wiki/Nerode-Relation">Nerode-Relation</a> bzgl. der Sprache ist endlich. <code>$L \in {\cal L_3} \Rightarrow$</code> Das <a href="../pumping-lemma/" title="Beweis durch Widerspruch: Eine Sprache ist nicht regul&auml;r (Pumping-Lemma)">Pumping-Lemma</a> ist erfüllt.</p> <p>Für regul&auml;re Sprachen ist das Leerheitsproblem (<code>$L(G) \stackrel{?}{=} \emptyset$</code>) entscheidbar. Für regul&auml;re Sprachen ist das Endlichkeitsproblem (<code>$L(G) \stackrel{?}{&lt;} \infty$</code>) entscheidbar.</p> <p>Für kontextfreie Sprachen ist das Leerheitsproblem entscheidbar. Für kontextfreie Sprachen ist das Endlichkeitsproblem entscheidbar.</p> <p>Für Typ 0 und Typ 1 Sprachen ist das Leerheitsproblem nicht entscheidbar.</p> <p><code>$L \in {\cal L_2} \Leftrightarrow L$</code> wird von einem nichtdeterministischem Kellerautomaten erkannt.</p> <h2>Quellen</h2> <ul> <li>Uwe Sch&ouml;ning: <i>Theoretische Informatik- kurz gefasst</i>. 5.&nbsp;Auflage. Spektrum Akademischer Verlag, Heidelberg <span style="white-space:nowrap;">2008</span>, ISBN 978-3-8274-1824-1, <span class="plainlinks-print"><a rel="nofollow" class="external text" href="http://d-nb.info/986529222">DNB 986529222</a></span>.</li> <li>Tutorium, Skript, Vorlesung: Theoretische Grundlagen der Informatik am KIT bei Prof. Dr. Dorothea Wagner</li> </ul> Plotting function graphs with LaTeX http://martin-thoma.com/plotting-function-graphs-with-latex Fri, 27 Jan 2012 23:17:26 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/plotting-function-graphs-with-latex <p>It&#39;s crazy how much time I have wasted today just for searching for a working example how to plot a function within LaTeX. Here are two complete examples which worked for me. </p> <p>I have used this command to generate the PDF-file: <code>bash pdflatex latex.tex -output-format=pdf </code></p> <h2>gnuplot</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/gnuplot-300x246.png"><img src="../images/2012/01/gnuplot-300x246.png" alt="" width="300" height="246" class="size-medium wp-image-12781"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>tikz<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>pgfplots<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>tikzpicture<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>axis<span class="nb">}</span> <span class="k">\addplot</span>+[id=parable,domain=-5:5] gnuplot<span class="nb">{</span>4*x**2 - 5<span class="nb">}</span> node[pin=180:<span class="nb">{</span>`<span class="s">$</span><span class="m">4</span><span class="nb">x^</span><span class="m">2</span><span class="o">-</span><span class="m">5</span><span class="s">$</span>`<span class="nb">}</span>]<span class="nb">{}</span>; <span class="k">\end</span><span class="nb">{</span>axis<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>tikzpicture<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>tikzpicture</h2> <div style="width: 180px" class="wp-caption aligncenter"><a href="../images/2012/01/tikzpicture1-180x300.png"><img src="../images/2012/01/tikzpicture1-180x300.png" alt="" width="180" height="300" class="size-medium wp-image-12821"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="nb">{</span>article<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>tikz<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>tikzpicture<span class="nb">}</span> <span class="k">\draw</span><span class="na">[very thin,color=gray]</span> (0.0,0.0) grid (1.8,3.8); <span class="k">\draw</span><span class="na">[-&gt;]</span> (-0.5,0) -- (2,0) node[right] <span class="nb">{</span>`<span class="s">$</span><span class="nb">x</span><span class="s">$</span>`<span class="nb">}</span>; <span class="k">\draw</span><span class="na">[-&gt;]</span> (0,-0.5) -- (0,4) node[above] <span class="nb">{</span>`<span class="s">$</span><span class="nb">y</span><span class="s">$</span>`<span class="nb">}</span>; <span class="k">\draw</span> [domain=0:1/3,red] plot (<span class="k">\x</span>,3*3*<span class="k">\x</span>); <span class="k">\draw</span> [domain=1/3:2/3,red] plot (<span class="k">\x</span>,2*3-3*3*<span class="k">\x</span>); <span class="k">\draw</span> [domain=2/3:1.5,red] plot (<span class="k">\x</span>,0); <span class="k">\draw</span> [domain=0:1/4,orange] plot (<span class="k">\x</span>,4*4*<span class="k">\x</span>); <span class="k">\draw</span> [domain=1/4:2/4,orange] plot (<span class="k">\x</span>,2*4-4*4*<span class="k">\x</span>); <span class="k">\draw</span> [domain=2/4:1.5,orange] plot (<span class="k">\x</span>,0); <span class="k">\end</span><span class="nb">{</span>tikzpicture<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>Floating text</h2> <p>If you want to wrap the text around the graph, you can use wrapfigure: ```latex \documentclass{article}</p> <p>\usepackage{tikz} \usepackage{pgfplots} \usepackage{wrapfig}</p> <p>\begin{document} \begin{wrapfigure}{r}{.2\textwidth} \begin{center} \begin{tikzpicture} \draw<a href="-0.5,0">-&gt;</a> -- (2,0) node[right] {<code>$x$</code>}; \draw<a href="0,-0.5">-&gt;</a> -- (0,4) node[above] {<code>$y$</code>}; \draw [domain=0:1/3,red] plot (\x,3<em>3</em>\x); \draw [domain=1/3:2/3,red] plot (\x,2<em>3-3</em>3*\x); \draw [domain=2/3:1.5,red] plot (\x,0);</p> <div class="highlight"><pre><code class="text language-text" data-lang="text"> \draw [domain=0:1/4,orange] plot (\x,4*4*\x); \draw [domain=1/4:2/4,orange] plot (\x,2*4-4*4*\x); \draw [domain=2/4:1.5,orange] plot (\x,0); \end{tikzpicture} </code></pre></div> <p>\end{center} \end{wrapfigure}</p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis congue dictum elit. Morbi ultricies laoreet massa, sed sagittis lorem laoreet et. Donec at erat non sem tristique rutrum vel vel justo. Vestibulum tincidunt pulvinar mi, a congue purus dignissim vel. Ut porttitor dignissim neque eget rutrum. Nunc gravida varius semper. Quisque et purus quam. Quisque ultricies tristique magna sit amet egestas. Mauris bibendum lacus semper justo consectetur blandit vitae non nisi. Etiam non augue nec est facilisis tempor. Nullam non diam vel erat fermentum gravida. Proin tincidunt turpis lobortis ante elementum suscipit. Curabitur congue, dolor fringilla feugiat blandit, quam libero euismod purus, eget commodo erat nibh a augue. Vestibulum ut tellus ac arcu semper facilisis. \end{document} ```</p> <h2>PSTricks</h2> <p>I have found <a href="http://www.tn-home.de/Tobias/Soft/TeX/TUG040611/presentation.pdf">some</a> <a href="http://en.wikipedia.org/wiki/PSTricks">very</a> <a href="http://www.siart.de/typografie/pstricks_20030809.pdf">nice</a> <a href="http://mirror.informatik.uni-mannheim.de/pub/mirrors/tex-archive/graphics/pstricks/contrib/pst-3dplot/pst-3dplot-doc.pdf">example</a> <a href="http://www.ursoswald.ch/LaTeXGraphics/pstricks/pstricks.html">images</a>, but no working LaTeX-Code.</p> <h2>Read more</h2> <ul> <li>Wikibooks: <a href="http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions">LaTeX/Floats, Figures and Captions</a></li> <li><a href="http://ftp.math.purdue.edu/mirrors/ctan.org/graphics/pgf/contrib/pgfplots/doc/latex/pgfplots/pgfplots.pdf">Manual for pgfplots</a> with lots of examples (as images and LaTeX in over 300 pages!)</li> <li>TeXample.net: <a href="http://www.texample.net/tikz/examples/gnuplot-basics/">GNUPLOT basics</a>, <a href="http://www.texample.net/tikz/examples/parameterized-plots/">Parameterized plots</a>, <a href="http://www.texample.net/tikz/examples/pgfplots/">Pgfplots</a></li> </ul> Check Computer / Hardware for Linux-compatibility http://martin-thoma.com/check-computer-hardware-for-linux-compatibility Fri, 27 Jan 2012 19:42:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/check-computer-hardware-for-linux-compatibility <p>Linux users who are not very skilled have a big problem: If they want to buy a new computer or new hardware, it is very difficult for them to find out if something works or not. I&#39;ll give you some hints how you could find it out:</p> <h2>Debian device driver check & report</h2> <p><a href="http://kmuto.jp/debian/hcl/">This site</a> checks your whole system. You only need to boot a Linux system (e.g. via <a href="http://en.wikipedia.org/wiki/Live_CD">LiveCD</a>) and execute:</p> <div class="highlight"><pre><code class="bash">lspci -n </code></pre></div> <p>in the terminal (which pops up if you type Ctrl + Alt + T). Copy it, paste it into the provided form and you will get a list of your hardware and simply &quot;Yes&quot; if this component works with Debian.</p> <h2>Linux HCL</h2> <p>The <a href="http://linuxhcl.com/">Linux HCL</a> provides a lot of hand-written reviews of users. Here is my <a href="http://linuxhcl.com/browse/product?id=7719">review of my notebook</a>.</p> <h2>UbuntuUsers</h2> <p>German users might want to take a look at the wiki-article &quot;<a href="http://wiki.ubuntuusers.de/Hardwaredatenbanken">Hardwaredatenbanken</a>&quot;.</p> Impact of SOPA protests http://martin-thoma.com/impact-of-sopa-protests Tue, 24 Jan 2012 07:06:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/impact-of-sopa-protests <p>It seems as if the SOPA protests were quite effective. 162 Millionen visitors of Wikipedia did see the message. <a href="http://www.facebook.com/zuck/posts/10100210345757211">Zuckerbergs Facebook post</a> got half a million Likes. Thousands bloggers downloaded protest plugins which blacked out their blog.</p> <div style="width: 240px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-protests-congress-supporters-opponents-240x300.jpg"><img src="../images/2012/01/sopa-protests-congress-supporters-opponents-240x300.jpg" alt="" width="240" height="300" class="size-medium wp-image-12661"/></a><p class="wp-caption-text"></p></div> <h2>See also</h2> <ul> <li><a href="http://projects.propublica.org/sopa/">SOPA Opera</a>: Where Do Your Members of Congress Stand on SOPA and PIPA?</li> <li><a href="http://arstechnica.com/tech-policy/news/2012/01/pipa-support-collapses-with-13-new-opponents-in-senate.ars">ArsTechnica</a>: PIPA support collapses, with 13 new Senators opposed</li> <li><a href="http://en.wikipedia.org/wiki/Protests_against_SOPA_and_PIPA">Wikipedia</a>: Protests against SOPA and PIPA</li> <li>German News: <a href="http://www.heise.de/newsticker/meldung/Proteste-gegen-PIPA-und-SOPA-zeigen-Erfolge-1416809.html">heise</a>, <a href="http://www.heise.de/newsticker/meldung/US-Senat-verschiebt-Abstimmung-ueber-Zensurgesetz-1418544.html">heise</a>, <a href="http://www.golem.de/1201/89174.html">Golem</a>, <a href="http://www.golem.de/1201/89229.html">Golem</a></li> </ul> SOPA protests http://martin-thoma.com/sopa-protests Wed, 18 Jan 2012 07:29:42 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/sopa-protests <p>Some of the biggest sites in the internet are currently calling US citizens up to protest. SOPA - the Stop Online Piracy Act - is endangering some key aspects of the internet.</p> <p>I am a little bit disappointed that Google had no special doodle today and twitter had no message at all :-( Well, at least did Google offer <a href="https://www.google.com/landing/takeaction/">some information</a>.</p> <p>Here is a neat explanation of SOPA: <iframe src="http://player.vimeo.com/video/31100268?byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p> <h2>Wikipedia</h2> <p>Completely blacked out: <a href="../images/2012/01/sopa-wikipedia.png"><img src="../images/2012/01/sopa-wikipedia-300x141.png" alt="" title="Wikipedia SOPA protests" width="300" height="141" class="aligncenter size-medium wp-image-12401" /></a> Twitter: #WikipediaBlackout</p> <p>By the way, if you disable JavaScript you can view Wikipedia as always.</p> <h2>German Wiki</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-wiki-de-300x81.png"><img src="../images/2012/01/sopa-wiki-de-300x81.png" alt="" width="300" height="81" class="size-medium wp-image-12411"/></a><p class="wp-caption-text"></p></div> <h2>The Oatmeal</h2> <p><a href="http://theoatmeal.com/sopa">The Oatmeal</a> has also completely blacked out its website:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-oatmeal-300x241.png"><img src="../images/2012/01/sopa-oatmeal-300x241.png" alt="" width="300" height="241" class="size-medium wp-image-12541"/></a><p class="wp-caption-text"></p></div> <h2>Zachstronaut</h2> <p><a href="http://www.zachstronaut.com/lab/text-shadow-box/stop-sopa.html">zachstronaut.com</a> offers an interactive one: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-zachstronaut-300x154.png"><img src="../images/2012/01/sopa-zachstronaut-300x154.png" alt="" width="300" height="154" class="size-medium wp-image-12461"/></a><p class="wp-caption-text"></p></div></p> <h2>Boing Boing</h2> <p><a href="http://boingboing.net/2012/01/14/boing-boing-will-go-dark-on-ja.html">Boing Boing</a> is completely blacked out: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-boingboing-300x140.png"><img src="../images/2012/01/sopa-boingboing-300x140.png" alt="" width="300" height="140" class="size-medium wp-image-12451"/></a><p class="wp-caption-text"></p></div></p> <h2>Tucows</h2> <p>Tucows - a site with $80.939 million USD revenue - offers some information and a <a href="http://tucowsinc.com/news/2012/01/why-we-dont-like-sopa/">link</a> on the top. They normally offer shareware and freeware: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2012/01/sopa-tucowsinc-300x182.png"><img src="../images/2012/01/sopa-tucowsinc-300x182.png" alt="" width="300" height="182" class="size-medium wp-image-12431"/></a><p class="wp-caption-text"></p></div></p> <h2>Notes</h2> <p>Many big companies (AOL, eBay, Facebook, Google, LinkedIn, mozilla, twitter, Yahoo, zynga) wrote <a href="http://www.protectinnovation.com/downloads/letter.pdf">a letter</a> to the Committee on the Judiciary.</p> <h2>Participate</h2> <p>If you want to participate, take a look at <a href="http://sopastrike.com/">SOPAstrike.com</a>, <a href="http://AmericanCensorship.org/">americancensorship.org</a> or <a href="https://twitter.com/#!/search/realtime/%23StrikeTools">#striketools</a>.</p> <h2>Additional</h2> <p><object width="526" height="374"> <param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always"/> <param name="wmode" value="transparent"></param> <param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talk/stream/2012S/Blank/ClayShirky_2012S-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/ClayShirky_2012S-embed.jpg&vw=512&vh=288&ap=0&ti=1329&lang=en&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=defend_our_freedom_to_share_or_why_sopa_is_a_bad_idea;year=2012;theme=media_that_matters;theme=master_storytellers;event=TEDSalon+NY2012;tag=Business;tag=Technology;tag=creativity;tag=media;tag=politics;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /> <embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2012S/Blank/ClayShirky_2012S-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/ClayShirky_2012S-embed.jpg&vw=512&vh=288&ap=0&ti=1329&lang=en&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=defend_our_freedom_to_share_or_why_sopa_is_a_bad_idea;year=2012;theme=media_that_matters;theme=master_storytellers;event=TEDSalon+NY2012;tag=Business;tag=Technology;tag=creativity;tag=media;tag=politics;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;"></embed> </object></p> <ul> <li>Paper of the <a href="https://www.eff.org/sites/default/files/One-Page-SOPA_0.pdf">Electronic Frontier Foundation</a> and <a href="https://www.eff.org/free-speech-weak-link">web page</a></li> <li>Position of <a href="http://dyn.com/sopa-breaking-dns-parasite-stop-online-piracy/">dyn.com</a></li> <li>Position of <a href="http://xkcd.com/1005/">xkcd</a></li> </ul> Bachelor Informatik, 1. Semester: Was bisher geschah http://martin-thoma.com/bachelor-informatik-1-semester-was-bisher-geschah Sun, 08 Jan 2012 19:38:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/bachelor-informatik-1-semester-was-bisher-geschah <p>Die erste H&auml;lfte des Semesters ist nun vorbei und es wird Zeit zu wiederholen, was man wissen sollte. Eventuell ist diese Liste f&uuml;r ein paar Kommilitonen von nutzen. Wenn man gerade eines der Module macht, sollte man alles wissen, was in den Links steht. Naja, vielleicht nicht alles, aber man sollte auf jeden Fall die Begriffe im Schlaf definieren k&ouml;nnen. Die Links sind meist deutsche Wiki-Artikel, manchmal auch englische. Je nach dem, was ich besser fand.</p> <p>Einiges h&auml;tte ich bei vielen Modulen schreiben k&ouml;nnen, z.B. der Beweis durch Induktion. Ich habe mir dann einfach eines ausgesucht und es nur da hinein geschrieben. Das ist eh schon lang genug.</p> <h2>1. Semester</h2> <h3>Analysis I</h3> <h4>Fachbegriffe</h4> <ul> <li><strong>Verkn&uuml;pfungseigenschaften</strong>: <a href="http://de.wikipedia.org/wiki/Kommutativgesetz">Kommutativgesetz</a>, <a href="http://de.wikipedia.org/wiki/Assoziativgesetz">Assoziativgesetz</a>, <a href="http://de.wikipedia.org/wiki/Distributivgesetz">Distributivgesetz</a></li> <li><strong>Relationen</strong>: <a href="http://de.wikipedia.org/wiki/Injektivit%C3%A4t">Injektivit&auml;t</a>, <a href="http://de.wikipedia.org/wiki/Surjektivit%C3%A4t">Surjektivit&auml;t</a>, <a href="http://de.wikipedia.org/wiki/Bijektive_Funktion">Bijektivit&auml;t</a>, Linkstotalit&auml;t, Rechtseindeutigkeit, <a href="http://de.wikipedia.org/wiki/Reflexive_Relation">Reflexivit&auml;t</a>, <a href="http://de.wikipedia.org/wiki/Antisymmetrie">Antisymmetrie</a>, <a href="http://de.wikipedia.org/wiki/Symmetrische_Relation">Symmetrie</a>, <a href="http://de.wikipedia.org/wiki/Transitivit%C3%A4t_(Mathematik)">Transitivit&auml;t</a>, <a href="http://de.wikipedia.org/wiki/Ordnungsrelation">Ordnungsrelation</a>, <a href="http://de.wikipedia.org/wiki/%C3%84quivalenzrelation">&Auml;quivalenzrelation</a></li> <li><strong>Mengeneigenschaften</strong>: <a href="http://de.wikipedia.org/wiki/Abz%C3%A4hlbarkeit">Abz&auml;hlbarkeit</a>, <a href="http://de.wikipedia.org/wiki/%C3%9Cberabz%C3%A4hlbarkeit">&Uuml;berabz&auml;hlbarkeit</a>, endlich, unendlich, <a href="http://de.wikipedia.org/wiki/Beschr%C3%A4nktheit">Beschr&auml;nktheit</a></li> <li><strong>Folgeneigenschaften</strong>: <a href="http://de.wikipedia.org/wiki/Supremum">Supremum</a>, Infimum, Minimum, Maximum, Konvergenz, Divergenz, <a href="http://de.wikipedia.org/wiki/Grenzwert_(Folge)">Grenzwert</a>, Limes superior, Limes inferior, <a href="http://de.wikipedia.org/wiki/Monotonie_(Mathematik)">Monotonie</a></li> <li><a href="../wie-fuhre-ich-einen-induktionsbeweis/" title="Wie f&uuml;hre ich einen Induktionsbeweis?">Beweis durch vollst&auml;ndige Induktion</a></li> <li><a href="http://de.wikipedia.org/wiki/Teilfolge">Teilfolgen</a>, H&auml;ufungswerte</li> <li><a href="http://de.wikipedia.org/wiki/Reihe_(Mathematik)">Reihen</a>: Monotoniekriterium, Dreiecksungleichung</li> <li><a href="http://de.wikipedia.org/wiki/Umordnung_von_Reihen">Umordnungen</a> und Produktreihen</li> <li><a href="http://de.wikipedia.org/wiki/Potenzreihe">Potenzreihen</a>, <a href="http://de.wikipedia.org/wiki/Konvergenzradius">Konvergenzradius</a></li> <li>g-adische Entwicklungen</li> <li><strong>Funktionen</strong>: Grenzwerte, H&auml;ufungspunkte, <a href="http://de.wikipedia.org/wiki/Stetigkeit">Stetigkeit</a>, abgeschlossen, offen, <a href="http://de.wikipedia.org/wiki/Gleichm%C3%A4%C3%9Fige_Konvergenz">gleichm&auml;&szlig;ige Konvergenz</a>, <a href="http://de.wikipedia.org/wiki/Gleichm%C3%A4%C3%9Fige_Stetigkeit">gleichm&auml;&szlig;ige Stetigkeit</a>, <a href="http://de.wikipedia.org/wiki/Lipschitz-Stetigkeit">Lipschitz-Stetigkeit</a></li> </ul> <h4>S&auml;tze</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Satz_von_Bolzano-Weierstra%C3%9F">Satz von Bolzano-Weierstra&szlig;</a></li> <li><a href="http://de.wikipedia.org/wiki/Cauchy-Kriterium">Cauchy-Kriterium</a></li> <li><a href="http://de.wikipedia.org/wiki/Leibniz-Kriterium">Leibniz-Kriterium</a></li> <li><a href="http://de.wikipedia.org/wiki/Majorantenkriterium">Majorantenkriterium</a> und Minorantenkriterium</li> <li><a href="http://de.wikipedia.org/wiki/Wurzelkriterium">Wurzelkriterium</a></li> <li><a href="http://de.wikipedia.org/wiki/Quotientenkriterium">Quotientenkriterium</a></li> <li><a href="http://de.wikipedia.org/wiki/Riemannscher_Umordnungssatz">Riemannscher Umordnungssatz</a></li> </ul> <h4>Formeln</h4> <ul> <li>`$\binom{n}{k} + \binom{n}{k-1} = \binom{n+1}{k}$`</li> <li>`$a^{n+1} - b^{n+1} = (a - b) \sum_{k=0}^{n} a^{n-k} b^{k}$`</li> <li><a href="http://de.wikipedia.org/wiki/Bernoullische_Ungleichung">Bernoullische Ungleichung</a>: `$x \geq -1: (1+x)^n \geq 1 + nx ~ \forall n \in \mathbb{N}$`</li> <li><a href="http://de.wikipedia.org/wiki/Binomischer_Satz">Binomischer Lehrsatz</a>: `$(a+b)^n = \sum_{k=0}^{n} \binom{n}{k}a^{n-k} b^k ~ \forall n \in \mathbb{N}$`</li> </ul> <h4>Wichtige Grenzwerte</h4> <ul> <li>`$\sqrt[n\,]{n} \rightarrow 1 (n \rightarrow \infty)$`</li> <li>`$e = \lim_{n \to \infty} (1+\frac{1}{n})^n = \lim_{n \to \infty} \sum_{k=0}{n} \frac{1}{k!}$`</li> </ul> <h4>Wichtige Reihen</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Harmonische_Reihe">Harmonische Reihe</a>: `$\sum_{n=1}^\infty \frac{1}{n}$` (Divergent)</li> <li><a href="http://de.wikipedia.org/wiki/Geometrische_Reihe">Geometrische Reihe</a>: `$\sum_{n=0}^{\infty} x^n (x \in \mathbb{R})$`. Konvergiert, falls |x| < 1 gegen `$\frac{1}{1-x}$`</li> <li><a href="http://de.wikipedia.org/wiki/Alternierende_Reihe">Alternierende Harmonische Reihe</a>: `$\sum_{n=1}^{\infty} (-1)^{n+1} \frac{1}{n}$`</li> <li>`$e^x = \sum_{n=0}{\infty} \frac{x^n}{x!}$`</li> <li>Kosinus: `$cos(x) = \sum_{n=0}{\infty} (-1)^n \cdot \frac{x^{2n}}{(2n)!} (x \in \mathbb{R})$`</li> <li>Sinus: `$sin(x) = \sum_{n=0}^{\infty} (-1)^n \cdot \frac{x^{2n+1}}{(2n+1)!} (x \in \mathbb{R}$`</li> <li>Cosinus Hyperbolikus: `$cosh(x) = \frac{1}{2} (e^x + e^{-x}) (x \in \mathbb{R})$`</li> <li>Sinus Hyperbolikus: `$sinh(x) = \frac{1}{2} (e^x - e^{-x}) (x \in \mathbb{R})$`</li> </ul> <h4>Links und Materialien</h4> <ul> <li><a href="http://mitschriebwiki.nomeata.de/Ana1Infos.html">Skript</a></li> <li><a href="http://ocw.mit.edu/courses/mathematics/18-100b-analysis-i-fall-2010/">MIT OpenCourseWare</a></li> </ul> <h3>Lineare Algebra</h3> <h4>Algebraische Strukturen</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Gruppentheorie">Gruppen</a>: <ul> <li><a href="http://de.wikipedia.org/wiki/Gruppentheorie#Definition">Definition</a></li> <li>Beispiele: alle Ringe und K&ouml;rper</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Ringtheorie">Ringe</a>: <ul> <li><a href="http://de.wikipedia.org/wiki/Ringtheorie#Ring">Definition</a></li> <li>Beispiele: alle K&ouml;rper</li> <li>Gegenbeispiele: `$(\mathbb{N}, +, \cdot)$`</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/K%C3%B6rper_(Algebra)">K&ouml;rper</a>: <ul> <li><a href="http://de.wikipedia.org/wiki/K%C3%B6rper_(Algebra)#Formale_Definition">Definition</a></li> <li>Beispiele: `$(\mathbb{Q}, +, \cdot), (\mathbb{R}, +, \cdot), (\mathbb{C}, +, \cdot), (\mathbb{Z}/p\mathbb{Z}, +, \cdot)$`</li> <li>Gegenbeispiele: `$(\mathbb{Z}, +, \cdot)$`</li> </ul> </li> <li><a href="http://de.wikipedia.org/wiki/Vektorraum">Vektorr&auml;ume</a>: <ul> <li><a href="http://de.wikipedia.org/wiki/Vektorraum#Formale_Definition">Definition</a></li> <li>Beispiele: `$\mathbb{R}^2, \mathbb{R}^3, ... , \mathbb{R}^n,$` Ring der Polynome</li> </ul> </li> </ul> <h4>Algorithmen</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Gau%C3%9Fsches_Eliminationsverfahren">Gau&szlig;sches Eliminationsverfahren</a>: <ul> <li>Was bedeuten Nullzeilen?</li> <li>Wann hat das LGS keine / eine / viele L&ouml;sungen?</li> <li>Welche Operationen erlaubt der Algorithmus?</li> </ul></li> <li><a href="http://de.wikipedia.org/wiki/Matrix_(Mathematik)#Matrizenmultiplikation">Matrixmultiplikation</a></li> </ul> <h4>Dies und das</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Permutation">Permutationen</a> und Transpositionen, <a href="http://de.wikipedia.org/wiki/Identische_Abbildung">Identische Abbildung</a></li> <li><a href="http://de.wikipedia.org/wiki/Direkte_Summe#Innere_direkte_Summe">Direkte Summe</a></li> <li><a href="../wie-bildet-man-den-schnitt-zweier-vektorraume/" title="Wie bildet man den Schnitt zweier Vektorr&auml;ume?">Schnitt zweier Vektorr&auml;ume berechnen</a></li> <li>Was bedeuten die folgenden Symbole: `$\subseteq, \subset, \subsetneq, \cup, \setminus, \cap, \emptyset$`</li> <li><a href="http://de.wikipedia.org/wiki/De_Morgan%E2%80%99sche_Gesetze">Regeln von de Morgan</a>: `$(A \cup B)^C = A^C \cap B^C$` und `$(A \cap B)^C = A^C \cup B^C$`</li> <li><a href="http://de.wikipedia.org/wiki/Homomorphismus">Homomorphismen</a>, <a href="http://de.wikipedia.org/wiki/Isomorphismus">Isomorphismen</a> (<a href="http://de.wikipedia.org/wiki/Automorphismus">Automorphismus</a>)</li> <li><a href="http://de.wikipedia.org/wiki/Charakteristik_(Mathematik)">Charakteristik</a>, <a href="http://de.wikipedia.org/wiki/Lineare_H%C3%BClle">Lineare H&uuml;lle</a>, <a href="http://de.wikipedia.org/wiki/Erzeugendensystem">Erzeugendensystem</a>, <a href="http://de.wikipedia.org/wiki/Basis_(Vektorraum)">Basis</a>, <a href="http://de.wikipedia.org/wiki/Standardbasis">Standardbasis</a>, <a href="http://de.wikipedia.org/wiki/Basiswechsel_(Vektorraum)">Basiswechsel</a></li> </ul> <h4>Links und Materialien</h4> <ul> <li><a href="http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/">MIT OpenCourseWare</a> (<a href="http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/video-lectures/">Video Lectures</a>)</li> </ul> <h3>Programmieren</h3> <p>Nur grundlagen in Java: <ul> <li><a href="http://de.wikipedia.org/wiki/Objekt_(Programmierung)">Objekt</a></li> <li><a href="http://de.wikipedia.org/wiki/Klasse_(Programmierung)">Klasse</a></li> <li><a href="http://de.wikipedia.org/wiki/Instanz_(Informatik)">Instanz</a></li> <li><a href="http://de.wikipedia.org/wiki/Methode_(Programmierung)">Methode</a></li> <li><a href="http://de.wikipedia.org/wiki/Zugriffsfunktion">Getter und Setter</a></li> <li><a href="http://de.wikipedia.org/wiki/Rekursion">Rekursion</a></li> <li>Zugriffsmodifikatoren: public, protected, private</li> <li><a href="http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html">abstract</a></li> <li><a href="http://de.wikipedia.org/wiki/Javadoc">Javadoc</a></li> <li><a href="http://de.wikibooks.org/wiki/Java_Standard:_Objekte#equals.28Object.29">.equals, .toString</a></li> </ul></p> <h3>Grundbegriffe der Informatik</h3> <h4>Aussagenlogik</h4> <ul> <li>Was bedeuten die folgenden Symbole: `$\Rightarrow, \Leftrightarrow, \neg, \land, \lor, \forall, \exists$`</li> </ul> <h4>Formale Sprachen</h4> <ul> <li>Wo ist der Unterschied zwischen `$\varepsilon$` und `$\emptyset$`?</li> <li><a href="http://de.wikipedia.org/wiki/Alphabet_(Informatik)">Alphabet</a>, <a href="http://de.wikipedia.org/wiki/Wort_(Theoretische_Informatik)">Wort</a>, <a href="http://de.wikipedia.org/wiki/Formale_Grammatik">Grammatik</a>, <a href="http://de.wikipedia.org/wiki/Formale_Sprache">Sprache</a></li> </ul> <h4>Graphen</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Gerichteter_Graph#Gerich">gerichtete</a>, ungerichtete und <a href="http://de.wikipedia.org/wiki/Graph_(Graphentheorie)#Gewichteter_Graph">gewichtete</a> <a href="http://de.wikipedia.org/wiki/Graph_(Graphentheorie)">Graphen</a></li> <li><a href="http://de.wikipedia.org/wiki/Baum_(Graphentheorie)">Baum</a>, <a href="http://de.wikipedia.org/wiki/Wurzel_(Graphentheorie)">Wurzel</a>, <a href="http://de.wikipedia.org/wiki/Bin%C3%A4rbaum">Bin&auml;rbaum</a></li> <li><a href="http://de.wikipedia.org/wiki/Glossar_Graphentheorie#Schleife">Schleife</a>, Schlinge, <a href="http://de.wikipedia.org/wiki/Glossar_Graphentheorie#Kreis">Kreis</a></li> </ul> <h4>Dies und das</h4> <ul> <li>Zusicherungen, <a href="http://de.wikipedia.org/wiki/Schleifeninvariante">Schleifeninvariante</a></li> <li><a href="http://de.wikipedia.org/wiki/Huffman-Codierung">Huffman-Codierung</a></li> <li><a href="http://de.wikipedia.org/wiki/Algorithmus_von_Floyd_und_Warshall">Algorithmus von Warshall</a>, <a href="http://de.wikipedia.org/wiki/Adjazenzmatrix#Adjazenzmatrix_.28Nachbarschaftsmatrix.29">Adjazenzmatrix</a></li> <li><a href="http://de.wikipedia.org/wiki/Landau-Symbole">Landau-Symbole</a>: `$\cal O, \Omega, \Theta$`</li> <li><a href="http://de.wikipedia.org/wiki/Mealy-Automat">Mealy-Automat</a> und <a href="http://de.wikipedia.org/wiki/Moore-Automat">Moore-Automat</a></li> </ul> <h2>3. Semester</h2> <h3>Betriebssysteme</h3> <h4>Dies und das</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/POSIX">POSIX</a></li> <li>policy and mechanism</li> <li><a href="http://en.wikipedia.org/wiki/Multiprogramming">multiprogramming</a> and <a href="http://en.wikipedia.org/wiki/Batch_system">Batch processing</a></li> <li><a href="http://en.wikipedia.org/wiki/Zombie_process">Zombie</a> and <a href="http://en.wikipedia.org/wiki/Orphan_process">Orphan</a>, <a href="http://en.wikipedia.org/wiki/Fork_(operating_system)">fork</a>, <a href="http://en.wikipedia.org/wiki/Fork_bomb">fork bomb</a></li> <li>Memory layout of a process (Stack, Heap, BSS, data, rodata, text)</li> <li>(synchroner / asynchroner) <a href="http://de.wikipedia.org/wiki/Interrupt">Interrupt</a>, Excaption, Trap, <a href="http://de.wikipedia.org/wiki/System_Call">System Call</a></li> </ul> <h4>Multithreaded Programming</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Deadlock">Deadlock</a></li> <li>Mutual exclusion, hold and wait, No preemption</li> <li><a href="http://de.wikipedia.org/wiki/Critical_Section">Critical section</a>, <a href="http://de.wikipedia.org/wiki/Semaphor_(Informatik)">semaphore</a>, <a href="http://de.wikipedia.org/wiki/Mutex">mutex</a>, binary semaphore</li> <li>Spinlock</li> <li>Progress, Bounded waiting</li> <li><a href="http://de.wikipedia.org/wiki/Race_Condition">Race Condition</a></li> </ul> <h4>Cache</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Cache">Cache</a> <li><a href="http://en.wikipedia.org/wiki/CPU_cache">CPU cache</a></li> <li><a href="http://de.wikipedia.org/wiki/Cache-Algorithmus#Write_Through_.28Write_Thru.29">Write through</a> und <a href="http://de.wikipedia.org/wiki/Cache-Algorithmus#Write_Back">write back</a> policy</li> <li><a href="http://de.wikipedia.org/wiki/Lokalit%C3%A4tseigenschaft">Lokalit&auml;tseigenschaft</a></li> </ul> <h4>Scheduling</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Prozess-Scheduler">scheduler</a></li> <li><a href="http://en.wikipedia.org/wiki/Gantt_chart">Gantt chart</a></li> <li>turnaround time, response time, waiting time</li> <li>Starvation</li> <li>hardware requirements of preemptitive scheduling</li> <li><a href="http://en.wikipedia.org/wiki/Scheduling_(computing)#Dispatcher">dispatcher</a></li> </ul> <h4>Memory Management</h4> <ul> <li>TLB: <a href="http://de.wikipedia.org/wiki/Translation_Lookaside_Buffer">Translation Lookaside Buffer</a></li> <li>Swapping: Roll out, Roll in</li> <li>Allocation</li> <li>Relocation</li> <li>Segmentation</li> <li><a href="http://en.wikipedia.org/wiki/Paging">Paging</a></li> <li>First-fit, Best-fit, Worst-fit</li> <li>External Fragmentation, Internal Fragmentation</li> <li>Compile Time, Load time, Execution time</li> <li>Segment table</li> </ul> <h3>Theoretische Grundlagen der Informatik</h3> <h4>Automaten</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Deterministischer_endlicher_Automat">DEA</a>: `$(Q, \Sigma, \delta: Q \times \Sigma \rightarrow Q, s \in Q, F \subseteq Q)$`</li> <li><a href="http://de.wikipedia.org/wiki/Nichtdeterministischer_endlicher_Automat">NEA</a>: `$(Q, \Sigma, \delta: Q \times \Sigma \rightarrow 2^Q, s \in Q, F \subseteq Q)$`, wobei `$2^Q$` die Potenzmenge von Q ist.</li> <li>&Auml;quivalenz von DEA und NEA sowie die <a href="../konstruktion-eines-deterministischen-endlichen-automaten-aus-einem-nicht-deterministischem/" title="Konstruktion eines deterministischen endlichen Automaten aus einem nicht-deterministischem">Konstruktion</a></li> <li><a href="http://de.wikipedia.org/wiki/Turingmaschine">Turingmaschine</a>: `$(Q, \Sigma, \square, \Gamma, s \in Q, \delta: Q \times \Gamma \rightarrow Q \times \Gamma \times \{L, R, N\}, F \subseteq Q)$`</li> <li><a href="http://de.wikipedia.org/wiki/Churchsche_These">Church'che These</a></li> <li><a href="http://de.wikipedia.org/wiki/Satz_von_Rice">Satz von Rice</a></li> <li>Orakelmodul, Orakelband und <a href="http://de.wikipedia.org/wiki/Orakel-Turingmaschine">Orakel-Turingmaschine</a></li> </ul> <h4>Sprachen und Probleme</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/Kleenescher_Abschluss">Kleene'scher Abschluss</a>: `$L^*$`</li> <li>Positiver Abschluss: `$L^+$`</li> <li>Produktsprache: `$L_1 \cdot L_2$`</li> <li>Komplementsprache: `$L^C := \Sigma^* \setminus L$`</li> <li><a href="http://de.wikipedia.org/wiki/Regul%C3%A4re_Sprache">Regul&auml;re Sprachen</a>: Alle von einem DEA erkannten Sprachen.</li> <li><a href="../pumping-lemma/" title="Beweis durch Widerspruch: Eine Sprache ist nicht regul&auml;r (Pumping-Lemma)">Pumping-Lemma</a></li> <li><a href="http://de.wikipedia.org/wiki/Nerode-Relation">Nerode-Relation</a></li> <li><a href="http://de.wikipedia.org/wiki/Entscheidbarkeit">Entscheidbarkeit</a>, <a href="http://de.wikipedia.org/wiki/Berechenbarkeit">Berechenbarkeit</a></li> <li><a href="http://de.wikipedia.org/wiki/Diagonalsprache">Diagonalsprache</a>, <a href="http://de.wikipedia.org/wiki/Halteproblem">Halteproblem</a>, Universelle Sprache, <a href="http://de.wikipedia.org/wiki/Post%27sches_Korrespondenzproblem">Postsches Korrespondenzproblem</a></li> <li>Entscheidungsprobleme, <a href="http://de.wikipedia.org/wiki/Optimierungsproblem">Optimalwertprobleme</a>, Optimierungsprobleme, Suchprobleme</li> <li><a href="http://de.wikipedia.org/wiki/Erf%C3%BCllbarkeitsproblem_der_Aussagenlogik">SAT</a>, <a href="http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden">TSP</a>, <a href="http://de.wikipedia.org/wiki/3-SAT">3-SAT</a>, <a href="http://de.wikipedia.org/wiki/Knoten%C3%BCberdeckungen,_Cliquen_und_stabile_Mengen">CLIQUE</a>, <a href="http://de.wikipedia.org/wiki/3COLOR">3COLOR</a>, <a href="http://de.wikipedia.org/wiki/Exact_Cover">EXACT COVER</a>, <a href="http://de.wikipedia.org/wiki/Subset_Sum">SUBSET SUM</a>, <a href="http://de.wikipedia.org/wiki/Partitionierungsproblem">PARTITION</a></li> <li>Approximationen, Approximationsg&uuml;te</li> </ul> <h4>Komplexit&auml;tsklassen</h4> <ul> <li><a href="http://de.wikipedia.org/wiki/P_(Komplexit%C3%A4tsklasse)">P</a> und co-P</li> <li><a href="http://de.wikipedia.org/wiki/NP_(Komplexit%C3%A4tsklasse)">NP</a> und <a href="http://de.wikipedia.org/wiki/Co-NP">co-NP</a></li> <li><a href="http://de.wikipedia.org/wiki/NP-Vollst%C3%A4ndigkeit">NPC</a> und <a href="http://de.wikipedia.org/wiki/Satz_von_Cook">Satz von Cook</a></li> <li><a href="http://de.wikipedia.org/wiki/P-NP-Problem">P vs. NP</a>: Wie k&ouml;nnte es bewiesen / wiederlegt werden?</li> <li>`$\cal NPI := NP \setminus (P \cup NPC)$`</li> <li><a href="http://de.wikipedia.org/wiki/NP-schwer">NP-schwer</a></li> </ul> <h3>Wahrscheinlichkeitstheorie</h3> <p>Hier haben wir ja die &quot;Wahrscheinlichkeitstheorie und Statistik f&uuml;r Studierende der Informatik und des Ingenieurwesens&quot; von Prof. Dr. N. Henze und Priv.-Doz. Dr. D. Kadelka. Das haben wir vermutlich auch schon durchgearbeitet. Da dieses Skript sehr ausf&uuml;hrlich ist und in die Klausur mitgenommen werden darf, sehe ich eigentlich keinen Bedarf an weiteren Erkl&auml;rungen. Es ist allerdings sehr zu empfehlen, die 11 &Uuml;bungsbl&auml;tter im VAB (Vorlesungsarbeitsbereich, Passwortgesch&uuml;tzt unter studium.kit.edu) zu machen!</p> Wie bildet man den Schnitt zweier Vektorräume? http://martin-thoma.com/wie-bildet-man-den-schnitt-zweier-vektorraume Sun, 08 Jan 2012 19:27:37 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-bildet-man-den-schnitt-zweier-vektorraume <h2>Angaben</h2> <p>Gegeben sind zwei Untervektorr&auml;ume des <code>$\mathbb{R}^4$</code>: <code>$U_1 := \left [\begin{pmatrix} 2 \\ 5 \\ 3 \\ 17 \end{pmatrix}, \begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}, \begin{pmatrix} 1 \\ 3 \\ 3 \\ 7 \end{pmatrix}, \begin{pmatrix} -1 \\ 1 \\ -1 \\ 1 \end{pmatrix} \right ]$</code></p> <p><code>$U_2 := \left [\begin{pmatrix} 0 \\ 0 \\ 4 \\ 2 \end{pmatrix}, \begin{pmatrix} 3 \\ 1 \\ 4 \\ 1 \end{pmatrix}, \begin{pmatrix} 2 \\ 7 \\ 1 \\ 8 \end{pmatrix}, \begin{pmatrix} 36 \\ 126 \\ 8 \\ 139 \end{pmatrix} \right ]$</code>.</p> <h2>Aufgabe</h2> <p>Finde eine Basis f&uuml;r <code>$U_1 \cap U_2$</code>.</p> <p>Zusatzaufgabe: Finde eine Basis f&uuml;r <code>$U_1 + U_2$</code>.</p> <h2>Basis finden</h2> <p>Will man eine m&ouml;glichst einfache Basis, also ein minimales Erzeugendensystem mit m&ouml;glichst kleinen Zahlen zu einem gegebenem Vektorraum finden, so kann man das <a href="http://de.wikipedia.org/wiki/Gau%C3%9Fsches_Eliminationsverfahren">Gau&szlig;sche Eliminationsverfahren</a> auf die erzeugenden Vektoren anwenden. Dazu transponiert man die Vektoren:</p> <p><code>$\left( \begin{array}{c c c c | c} 2 &amp; 5 &amp; 3 &amp; 17 &amp; 0\\ 1 &amp; 2 &amp; 3 &amp; 4 &amp; 0\\ 1 &amp; 3 &amp; 3 &amp; 7 &amp; 0\\ -1 &amp; 1 &amp;-1 &amp; 1 &amp; 0 \end{array} \right)$</code></p> <p>Da im Gau&szlig;sche Eliminationsverfahren nur das Vertauschen von Zeilen, die Multiplikation einer Zeile mit einer Konstanten und die Addition von Zeilen zugelassen sind, bleibt die rechte Spalte immer Null. Sie kann also weggelassen werden:</p> <p><code>$\left( \begin{array}{c c c c} 2 &amp; 5 &amp; 3 &amp; 17\\ 1 &amp; 2 &amp; 3 &amp; 4\\ 1 &amp; 3 &amp; 3 &amp; 7\\ -1 &amp; 1 &amp;-1 &amp; 1 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c} 1 &amp;-1 &amp; 1 &amp;-1\\ 0 &amp; 3 &amp; 2 &amp; 5\\ 0 &amp; 4 &amp; 2 &amp; 8\\ 0 &amp; 7 &amp; 1 &amp; 19 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c} 1 &amp;-1 &amp; 1 &amp;-1\\ 0 &amp; 1 &amp; \frac{1}{2} &amp; 2\\ 0 &amp; 0 &amp; \frac{1}{2} &amp; -1\\ 0 &amp; 0 &amp; -\frac{5}{2} &amp; 5 \end{array} \right) \rightsquigarrow $</code> <code>$\left( \begin{array}{c c c c} 1 &amp;-1 &amp; 1 &amp;-1\\ 0 &amp; 1 &amp; \frac{1}{2} &amp; 2\\ 0 &amp; 0 &amp; 1 &amp; -2\\ 0 &amp; 0 &amp; -5 &amp; 10 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c} 1 &amp; 0 &amp; 0 &amp; 4\\ 0 &amp; 1 &amp; 0 &amp; 3\\ 0 &amp; 0 &amp; 1 &amp; -2\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{array} \right)$</code></p> <p>Die Basis f&uuml;r <code>$U_1$</code> ist also <code>$\left \{\begin{pmatrix} 1 \\ 0 \\ 0 \\ 4 \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \\ 3 \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \\ -2 \end{pmatrix} \right \}$</code></p> <p>Ich habe gerade keine Lust, das ganze f&uuml;r <code>$U_2$</code> noch vorzurechnen. Es kommt <code>$\left( \begin{array}{c c c c} 1 &amp; 0 &amp; 0 &amp; -\frac{29}{38}\\ 0 &amp; 1 &amp; 0 &amp; \frac{49}{38}\\ 0 &amp; 0 &amp; 1 &amp; \frac{1}{2}\\ 0 &amp; 0 &amp; 0 &amp; 0 \end{array} \right)$</code>heraus, siehe <a href="http://www.wolframalpha.com/input/?i=RowReduce%5B%7B%7B2%2C+7%2C+1%2C+8%7D%2C%7B3%2C+1%2C+4%2C+1%7D%2C%7B0%2C+0%2C+4%2C+2%7D%2C%7B36%2C+126%2C+8%2C+139%7D%7D%5D">Wolfram|Alpha</a>. </p> <p>Die Basis f&uuml;r <code>$U_2$</code> ist also <code>$\left \{\begin{pmatrix} 1 \\ 0 \\ 0 \\ -\frac{29}{38} \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \\ \frac{49}{38} \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \\ \frac{1}{2} \end{pmatrix} \right \}$</code></p> <h2>Zassenhaus-Algorithmus</h2> <p>Bemerkung: Ich habe f&uuml;r den Zassenhaus-Algorithmus leiter die falsche Basis genommen. Der Rechenfehler zieht sich bis zum Ende durch. Wenn ich mal Zeit habe, werde ich es korrigieren (Alternativ: Wenn es jemand von euch macht, kann er den TeX-Code ja als Kommentar bereitstellen).</p> <p>Man transponiert die Basisvektoren von <code>$U_1$</code> und <code>$U_2$</code> und schreibt sie in eine Matrix: <code>$\left( \begin{array}{c | c} U_1^T &amp; U_1^T \\ \hline U_2^T &amp; 0 \end{array} \right)$</code>.</p> <p>Nat&uuml;rlich nimmt man f&uuml;r <code>$U_1$</code> die einfachere der beiden Basen. Dann l&ouml;st man das ganze wieder mit Gau&szlig;:</p> <p><code>$\left( \begin{array}{c c c c | c c c c} 1 &amp; 0 &amp; 0 &amp; 4 &amp; 1 &amp; 0 &amp; 0 &amp; 4 \\ 0 &amp; 1 &amp; 0 &amp; 3 &amp; 0 &amp; 1 &amp; 0 &amp; 3 \\ 0 &amp; 0 &amp; 1 &amp;-2 &amp; 0 &amp; 0 &amp; 1 &amp;-2 \\ \hline 1 &amp; 0 &amp; 0 &amp; - \frac{29}{38} &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 1 &amp; 0 &amp; \frac{49}{38} &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 1 &amp; \frac{1}{38} &amp; 0 &amp; 0 &amp; 0 &amp; 0 \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c | c c c c} 1 &amp; 0 &amp; 0 &amp; 4 &amp; 1 &amp; 0 &amp; 0 &amp; 4 \\ 0 &amp; 1 &amp; 0 &amp; 3 &amp; 0 &amp; 1 &amp; 0 &amp; 3 \\ 0 &amp; 0 &amp; 1 &amp;-2 &amp; 0 &amp; 0 &amp; 1 &amp;-2 \\ \hline 0 &amp; 0 &amp; 0 &amp; - \frac{181}{38} &amp; -1 &amp; 0 &amp; 0 &amp; -4 \\ 0 &amp; 0 &amp; 0 &amp; - \frac{65}{38} &amp; 0 &amp; -1 &amp; 0 &amp; -3 \\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; - \frac{38}{75} &amp; \frac{76}{75} \end{array} \right) \rightsquigarrow $</code> <code>$\left( \begin{array}{c c c c | c c c c} 1 &amp; 0 &amp; 0 &amp; 4 &amp; 1 &amp; 0 &amp; 0 &amp; 4 \\ 0 &amp; 1 &amp; 0 &amp; 3 &amp; 0 &amp; 1 &amp; 0 &amp; 3 \\ 0 &amp; 0 &amp; 1 &amp;-2 &amp; 0 &amp; 0 &amp; 1 &amp;-2 \\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; - \frac{38}{75} &amp; \frac{76}{75} \\ \hline 0 &amp; 0 &amp; 0 &amp; 0 &amp; -1 &amp; 0 &amp; \frac{181}{75} &amp; \frac{62}{75} \\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; -1 &amp; - \frac{13}{15} &amp; \frac{26}{15} \end{array} \right) \rightsquigarrow \left( \begin{array}{c c c c | c c c c} 1 &amp; 0 &amp; 0 &amp; 4 &amp; 1 &amp; 0 &amp; 0 &amp; 4 \\ 0 &amp; 1 &amp; 0 &amp; 3 &amp; 0 &amp; 1 &amp; 0 &amp; 3 \\ 0 &amp; 0 &amp; 1 &amp;-2 &amp; 0 &amp; 0 &amp; 1 &amp;-2 \\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; - \frac{38}{75} &amp; \frac{76}{75} \\ \hline 0 &amp; 0 &amp; 0 &amp; 0 &amp; -1 &amp; 0 &amp; 181 &amp; 62 \\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; 13 &amp; - 26 \end{array} \right)$</code></p> <p>Rechts unten steht nun die Basis f&uuml;r <code>$U_1 \cap U_2 = \left [ \left \{ \begin{pmatrix} -1 \\ 0 \\ 181 \\ 62 \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 13 \\ -26 \end{pmatrix} \right \} \right ]$</code>. Zus&auml;tzlich steht links oben die Basis f&uuml;r <code>$U_1 + U_2$</code>. Wenn man das noch etwas umformt ist es die Standardbasis des <code>$\mathbb{R}^4$</code>.</p> <h2>Methode 2</h2> <h3>Angabe</h3> <p><code>$U_1 = \left [ \left \{\begin{pmatrix} 1 \\ 0 \\ 0 \\ 4 \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \\ 3 \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \\ -2 \end{pmatrix} \right \} \right ]$</code>,</p> <p><code>$U_2 = \left [ \left \{\begin{pmatrix} 1 \\ 0 \\ 0 \\ -\frac{29}{38} \end{pmatrix}, \begin{pmatrix} 0 \\ 1 \\ 0 \\ \frac{49}{38} \end{pmatrix}, \begin{pmatrix} 0 \\ 0 \\ 1 \\ \frac{1}{38} \end{pmatrix} \right \} \right ]$</code></p> <h3>Rechnung</h3> <p>Es gilt: <code>$x \in U_1 \cap U_2$</code> <code>$\Leftrightarrow x \in U_1 \land x \in U_2$</code> <code>$\Leftrightarrow x = a \cdot x_1 + b \cdot x_2 + c \cdot x_3 = d \cdot y_1 + e \cdot y_2 + f \cdot y_3$</code> mit <code>$a, b, c, d, e, f \in \mathbb{R}$</code>. <code>$\begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1\\ 4 &amp; 3 &amp; 2 &amp; -\frac{29}{38} &amp; \frac{49}{38} &amp; \frac{1}{38} \end{pmatrix} \rightsquigarrow \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; -\frac{181}{38} &amp; -\frac{65}{38} &amp; -\frac{75}{38} \end{pmatrix}$</code> <code>$\rightsquigarrow \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0\\ 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; \frac{65}{181} &amp; \frac{75}{181} \end{pmatrix} \rightsquigarrow \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0 &amp; -\frac{65}{181} &amp; -\frac{75}{181}\\ 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; 0\\ 0 &amp; 0 &amp; 1 &amp; 0 &amp; 0 &amp; 1\\ 0 &amp; 0 &amp; 0 &amp; 1 &amp; \frac{65}{181} &amp; \frac{75}{181} \end{pmatrix}$</code></p> <p>Nun f&uuml;hrt der -1 - Trick zu dieser L&ouml;sung: <code>$\mathcal{L} = \left [ \left \{ \begin{pmatrix} -\frac{65}{181} \\ 1 \\ 0 \\ \frac{65}{181} \\ -1 \\ 0\end{pmatrix}, \begin{pmatrix} -\frac{75}{181} \\ 0 \\ 1 \\ \frac{75}{181} \\ 0 \\ -1 \end{pmatrix} \right \} \right ] = \left [ \left \{ \begin{pmatrix} -65 \\ 181 \\ 0 \\ 65 \\ -181 \\ 0\end{pmatrix}, \begin{pmatrix} -75 \\ 0 \\ 181 \\ 75 \\ 0 \\ -181 \end{pmatrix} \right \} \right ]$</code></p> <p>Das ist also die L&ouml;sung f&uuml;r Belegungen von a, b, c, d, e, f, sodass der resultierende Vektor sowohl in <code>$U_1$</code>, als auch in <code>$U_2$</code> ist.</p> <p>Allerdings sieht es so aus, als h&auml;tte ich mich irgendwo verrechnet ... Sieht jemand den Fehler?</p> <h2>Siehe auch</h2> <p><a href="http://werkzeuge.wieschoo.com/zassenalgo.php">Interaktiver Zassenhaus-Algorithmus</a></p> Frauenquote am KIT http://martin-thoma.com/frauenquote-am-kit Sat, 07 Jan 2012 22:57:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/frauenquote-am-kit <p>Die Frauenquote am KIT wird oft genannt, allerdings hatte ich bisher nur grobe Zahlen. Nun habe ich eine <a href="http://www.kit.edu/downloads/Statistik_WS11.pdf">zuverl&auml;ssige Quelle</a> mit Zahlen zum WS 2011/2012. Das ist die Frauenquote:</p> <p>Insgesamt: 26,6% (unter Deutschen: 25,3%; unter Ausl&auml;ndern: 33,5%)</p> <p>Fakult&auml;t f&uuml;r Architektur: 63,7 % Fakult&auml;t f&uuml;r Geisteswissenschaften: 62,2 % Fakult&auml;t f&uuml;r Chemie + Bio: 53,4 % Fakult&auml;t f&uuml;r Mathematik: 36,1 % Fakult&auml;t f&uuml;r Bauingenieur, Bio- und Umweltwissenschaften: 34,2 % Fakult&auml;t f&uuml;r Chemieingenieurwesen und Verfahrenstechnik: 30,1 % Fakult&auml;t f&uuml;r Wirtschaftswissenschaften: 23,9 % Fakult&auml;t f&uuml;r Informatik + Wirtschaftswissenschaften: 23,7 % Fakult&auml;t f&uuml;r Physik: 18,0 % Fakult&auml;t f&uuml;r Elektrotechnik und Informationstechnik: 10,9 % Fakult&auml;t f&uuml;r Maschinenbau: 10,6 % Fakult&auml;t f&uuml;r Informatik: 9,4 % Fakult&auml;t f&uuml;r Maschinenbau + Elektrotechnik und Informationstechnik: 8,7 % (diese Fakult&auml;t hat allerdings nur 23 Personen ...)</p> <p>70,4 % der Studenten kommen &uuml;brigens aus Baden-W&uuml;rttemberg.</p> <h2>Siehe auch</h2> <p><a href="http://www.ka-news.de/region/karlsruhe/thema-des-monats./Mythos-Maennerstadt-Wie-maennlich-ist-Karlsruhe;art6066,793025">Mythos M&auml;nnerstadt: Wie m&auml;nnlich ist Karlsruhe?</a></p> Wandering through the depths of find http://martin-thoma.com/wandering-through-the-depths-of-find Wed, 28 Dec 2011 15:01:18 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wandering-through-the-depths-of-find <p>find is a very mighty tool. It allows you to apply a very detailed search syntax. Every Linux user should know how to use it.</p> <h2>Very basic usage</h2> <p><a href="../images/2011/09/find-basic1.png"><img src="../images/2011/09/find-basic1.png" alt="`$ find /home -iname &#039;Tux*&#039;" title="$` find /home -iname &#039;Tux*&#039;" width="500" height="100" class="alignnone size-full wp-image-2671" /></a></p> <p>I told you I would start with the very basics, didn&#39;t I? So, you can need the option -iname if you want to do basic matching against the filename. The * can be used as a placeholder.</p> <h2>Redirecting errors</h2> <p>You might get some &quot;Permission denied&quot; errors. They are very bothersome if you combine commands in the bash. So you redirect them to /dev/null, a special file which discards everything it gets:</p> <p><a href="../images/2011/09/find-error-redirection.png"><img src="../images/2011/09/find-error-redirection.png" alt="find /home -iname &#039;Tux*&#039; 2>/dev/null&quot; title=&quot;find /home -iname &#039;Tux*&#039; 2&gt;/dev/null&quot; width=&quot;500&quot; height=&quot;100&quot; class=&quot;alignnone size-full wp-image-2691&quot; /&gt;</a></p> <h2>Real life example</h2> <p>I am also a developer who likes to have good names for constants, database tables and variables. Sometimes, like today, I think it&#39;s time to change a database table a bit. It got a lot more rows and the old name doesn&#39;t really fit any longer. I used a constant for the table name in all scripts. This constant was SOFTWARE<em>USER</em>TABLE and should now be USER<em>INFO</em>TABLE. So I have to search recursively and case-sensitive in my project and replace all occurences in all strings by the new string. Except for .svn-directories, of course. The easiest way to achieve this is via find, xargs and sed:</p> <div class="highlight"><pre><code class="bash">find . -path <span class="s1">&#39;*/.svn&#39;</span> -prune -o -type f -print0 <span class="p">|</span> xargs -0 sed -i <span class="s1">&#39;s/SOFTWARE_USER_TABLE/USER_INFO_TABLE/g&#39;</span> </code></pre></div> <p>Now the explanation of the different commands: <strong>find:</strong> <ul> <li>.: search in the current working directory</li> <li>-path &#39;*/.svn&#39; -prune&#39;: If a directory starting with .svn is in the path to the file, skip it</li> <li>-o: atlernative (OR)</li> <li>-type f: only search for files</li> <li>-print0: print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.</li> </ul> <strong>xargs</strong> -0: exchanges the arguments. -0 means that input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken lit erally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode. <strong>sed:</strong> <ul> <li>-i: edit the given file in-place. If you would not use -i, it would just print everything in standard output</li> <li>/g: edit the file globaly. If you would not use g, sed would only replace the first occurence of SOFTWARE<em>USER</em>TABLE</li> </ul></p> <h2>Snippets</h2> <p>move all files in subdirectories to a single directory:</p> <div class="highlight"><pre><code class="bash">find -type f -exec mv <span class="o">{}</span> collection/ <span class="se">\;</span> </code></pre></div> <p>find all files which are bigger than 20MB and print their location and size. Maybe you could use du for this one, but I don&#39;t know how:</p> <div class="highlight"><pre><code class="bash">find / -type f -size +20000k -exec ls -lh <span class="o">{}</span> <span class="se">\;</span> 2&gt;/dev/null <span class="p">|</span> awk <span class="s1">&#39;{ print `$5 &quot;:\t&quot; $`8 }&#39;</span> </code></pre></div> <p>find files in the home folder owned by alice:</p> <div class="highlight"><pre><code class="bash">find /home -user alice </code></pre></div> <h2>Further reading</h2> <p>Note that you should use grep if you want to search for patterns in single files.</p> <ul> <li><a href="http://linux.die.net/man/1/find">man page</a></li> <li><a href="http://en.wikipedia.org/wiki/Find">Wikipedia</a></li> </ul> Surprising C errors http://martin-thoma.com/surprising-c-errors Wed, 28 Dec 2011 14:18:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/surprising-c-errors <p>Those errors might be surprising and a good exercise for C beginners:</p> <h2>Empty printf</h2> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">error: zero-length gnu_printf format string </code></pre></div> <h2>Macros</h2> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#define MY_MACRO printf(&quot;Hello World\n&quot;);</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="n">MY_MACRO</span><span class="p">;</span> <span class="k">else</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Crazy, huh?</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">macro.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>main<span class="p">&amp;</span>rsquo<span class="p">;</span>: macro.c:8: error: <span class="p">&amp;</span>lsquo<span class="p">;</span><span class="k">else</span><span class="p">&amp;</span>rsquo<span class="p">;</span> without a previous <span class="p">&amp;</span>lsquo<span class="p">;</span><span class="k">if</span><span class="p">&amp;</span>rsquo<span class="p">;</span> </code></pre></div> <h2>Single and Double quotes</h2> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="err">&#39;</span><span class="n">hello</span><span class="p">,</span> <span class="n">world</span><span class="err">\</span><span class="n">n</span><span class="err">&#39;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">macro.c:5:9: warning: character constant too long <span class="k">for </span>its <span class="nb">type</span> macro.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>main<span class="p">&amp;</span>rsquo<span class="p">;</span>: macro.c:5: warning: passing argument 1 of <span class="p">&amp;</span>lsquo<span class="p">;</span><span class="nb">printf</span><span class="p">&amp;</span>rsquo<span class="p">;</span> makes pointer from integer without a cast /usr/include/stdio.h:339: note: expected <span class="p">&amp;</span>lsquo<span class="p">;</span>const char * __restrict__<span class="p">&amp;</span>rsquo<span class="p">;</span> but argument is of <span class="nb">type</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>int<span class="p">&amp;</span>rsquo<span class="p">;</span> macro.c:5: warning: format not a string literal and no format arguments </code></pre></div> <p>Thanks to <a href="http://www.drpaulcarter.com/cs/common-c-errors.php#3.1">drpaulcarter.com</a> for this example:</p> <div class="highlight"><pre><code class="c"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span> <span class="n">myPointer</span> <span class="o">=</span> <span class="sc">&#39;A&#39;</span><span class="p">;</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="n">myPointer</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">macro.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>main<span class="p">&amp;</span>rsquo<span class="p">;</span>: macro.c:3: warning: initialization makes pointer from integer without a cast </code></pre></div> <h2>Pointers</h2> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;string.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">char</span> <span class="o">*</span> <span class="n">myPointer</span><span class="p">;</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">myPointer</span><span class="p">,</span> <span class="s">&quot;Hello World!&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <div class="highlight"><pre><code class="bash">macro.c: In <span class="k">function</span> <span class="p">&amp;</span>lsquo<span class="p">;</span>main<span class="p">&amp;</span>rsquo<span class="p">;</span>: macro.c:7: warning: <span class="p">&amp;</span>lsquo<span class="p">;</span>myPointer<span class="p">&amp;</span>rsquo<span class="p">;</span> is used uninitialized in this <span class="k">function</span> </code></pre></div> <h2>Loops</h2> <div class="highlight"><pre><code class="c"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">);</span> <span class="n">x</span><span class="o">--</span><span class="p">;</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>No compiler error, but an infinite loop.</p> <h2>Null terminator of Strings</h2> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;stdlib.h&gt;</span> <span class="cp">#include &lt;string.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="kt">char</span> <span class="n">myArray</span><span class="p">[</span><span class="mi">20</span><span class="p">];</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Characters: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">myArray</span><span class="p">));</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">myArray</span><span class="p">,</span> <span class="s">&quot;abc&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Characters: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">myArray</span><span class="p">));</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">myArray</span><span class="p">,</span> <span class="s">&quot;Hello World!&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Characters: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">myArray</span><span class="p">));</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;String: -%s-</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">myArray</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Size: %i Byte</span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">myArray</span><span class="p">));</span> <span class="kt">char</span> <span class="o">*</span> <span class="n">myString</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">myArray</span><span class="p">));</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">myString</span><span class="p">,</span> <span class="n">myArray</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;String: -%s-</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">myString</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Size: %i Byte</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">myString</span><span class="p">));</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Characters: %i</span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">myString</span><span class="p">));</span> <span class="kt">char</span> <span class="o">*</span> <span class="n">breakIt</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">myString</span><span class="p">));</span> <span class="n">strcpy</span><span class="p">(</span><span class="n">breakIt</span><span class="p">,</span> <span class="n">myString</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;String: -%s-</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">breakIt</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Size: %i Byte</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">breakIt</span><span class="p">));</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Characters: %i</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">breakIt</span><span class="p">));</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>Again, you don&#39;t get a compiler error, but some strange results:</p> <div class="highlight"><pre><code class="bash">Characters: 0 Characters: 3 Characters: 12 String: -Hello World!- Size: 20 Byte String: -Hello World!- Size: 4 Byte Characters: 12 String: -Hello World!- Size: 4 Byte Characters: 13 </code></pre></div> <h2>Further reading</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/C_preprocessor">C Preprocessor</a> and <a href="http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion">macros</a></li> <li><a href="http://www.drpaulcarter.com/cs/common-c-errors.php#2.8">Pointer initialisation</a></li> <li><a href="http://linux.die.net/man/3/strcpy">strcpy</a>, <a href="http://linux.die.net/man/3/strlen">strlen</a></li> </ul> What seems to be wrong in the U.S. - some caricatures http://martin-thoma.com/what-seems-to-be-wrong-in-the-u-s-some-caricatures Wed, 28 Dec 2011 13:23:30 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/what-seems-to-be-wrong-in-the-u-s-some-caricatures <p>I am not the first person you should ask if you want to know something about the United States. I&#39;ve never been there and I know only one American. But I am reading quite a lot of websites which publish regularly political caricatures. This post is simply a collection of different caricatures I&#39;ve stumbled over. For most of them I had to search the source, so I hope you will enjoy them.</p> <p>If you are the owner of one of these websites and don&#39;t want me to publish your caricatures, I&#39;ll remove them. But I will also remove the link to your website.</p> <h2>We are the 99%</h2> <p><a href="http://en.wikipedia.org/wiki/We_are_the_99%25">We are the 99%</a> is a political slogan of &quot;Occupy&quot; protesters. It refers to the vast concentration of wealth among the top 1% of income earners compared to the other 99%, and indicates that most people are paying the price for the mistakes of a tiny minority.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/99-percent-300x217.jpg"><img src="../images/2011/12/99-percent-300x217.jpg" alt="" width="300" height="217" class="size-medium wp-image-10371 "/></a><p class="wp-caption-text"></p></div> <p>(mattbors.com has some more caricatures from the occupy protesters)</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/wall-street-demonstrators-bankers-300x227.jpg"><img src="../images/2011/12/wall-street-demonstrators-bankers-300x227.jpg" alt="" width="300" height="227" class="size-medium wp-image-10391"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/dessert-american-style-300x225.jpg"><img src="../images/2011/12/dessert-american-style-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-10441"/></a><p class="wp-caption-text"></p></div> <p>Some of the best caricatures are made by <a href="http://en.wikipedia.org/wiki/David_Horsey">David Horsey</a>. </p> <h2>Republicans</h2> <p>The <a href="http://en.wikipedia.org/wiki/Republican_Party_(United_States)">Republican Party</a> is one of the two major contemporary political parties in the United States, along with the Democratic Party. Founded by anti-slavery expansion activists in 1854, it is often called the GOP (Grand Old Party). The party&#39;s platform generally reflects American conservatism in the U.S. political spectrum and is considered center-right, in contrast to the center-left Democratic Party.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/republicans-big-government-300x249.jpg"><img src="../images/2011/12/republicans-big-government-300x249.jpg" alt="" width="300" height="249" class="size-medium wp-image-10501"/></a><p class="wp-caption-text"></p></div> <h2>Tea Party</h2> <p>The <a href="http://en.wikipedia.org/wiki/Tea_Party_movement">Tea Party movement</a> is an American populist political movement that is generally recognized as conservative and libertarian, and has sponsored protests and supported political candidates since 2009. It endorses reduced government spending, opposition to taxation in varying degrees, reduction of the national debt and federal budget deficit, and adherence to an originalist interpretation of the United States Constitution.</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/tea-party-big-government-300x219.jpg"><img src="../images/2011/12/tea-party-big-government-300x219.jpg" alt="" width="300" height="219" class="size-medium wp-image-10491"/></a><p class="wp-caption-text"></p></div> <p>Phil Hands has also made a nice one, but I&#39;ve only found a page which clearly states &quot;pay per use&quot;. What a pity!</p> <p>I&#39;ve just found the category tea party of <a href="http://theweek.com/section/cartoon/19/220783/the-tea-party">theweek.com</a>.</p> <h2>Education</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/education-africa-china-usa-300x181.jpg"><img src="../images/2011/12/education-africa-china-usa-300x181.jpg" alt="" width="300" height="181" class="size-medium wp-image-10561"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/large-university-student-debt-us-300x225.jpg"><img src="../images/2011/12/large-university-student-debt-us-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-10571"/></a><p class="wp-caption-text"></p></div> <h2>National debt</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/national-debt-trillion-caricature-jeff-parker-300x235.jpg"><img src="../images/2011/12/national-debt-trillion-caricature-jeff-parker-300x235.jpg" alt="" width="300" height="235" class="size-medium wp-image-10591"/></a><p class="wp-caption-text"></p></div> <p>I was very astonished that I did not find much about torture (e.g. <a href="http://en.wikipedia.org/wiki/Waterboarding">waterboarding</a>), human and civil rights (e.g. <a href="http://en.wikipedia.org/wiki/Guantanamo_Bay_detention_camp">Guantanamo Bay</a>, <a href="http://en.wikipedia.org/wiki/Capital_punishment_in_the_United_States">death penalty</a>) and the widespread ownership of arms (see <a href="http://en.wikipedia.org/wiki/Second_Amendment_to_the_United_States_Constitution">2nd Amendment</a>, <a href="http://en.wikipedia.org/wiki/List_of_countries_by_intentional_homicide_rate">List of countries by intentional homicide rate</a>).</p> <p>Do you know some good sites with caricatures? What do you think are the problems of Europe / Germany?</p> Adding a ppa in Ubuntu http://martin-thoma.com/adding-a-ppa-in-ubuntu Sat, 24 Dec 2011 14:30:06 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/adding-a-ppa-in-ubuntu <p>PPAs (<a href="http://en.wikipedia.org/wiki/Personal_Package_Archive">Personal Package Archive</a>) provide additional resources. They are small repositories you can add to get some special content.</p> <p>You can add them with Bash:</p> <div class="highlight"><pre><code class="bash">sudo add-apt-repository ppa:&lt;repository-name&gt; </code></pre></div> <p>Lets make an example:</p> <p>If you want to install <a href="http://clipgrab.de/en">Clipgrab</a>, you add the repository first:</p> <div class="highlight"><pre><code class="bash">sudo add-apt-repository ppa:clipgrab </code></pre></div> <p>Then you have to update your sources:</p> <div class="highlight"><pre><code class="bash">sudo apt-get update </code></pre></div> <p>Now you can install clipgrab the usual way:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install clipgrab </code></pre></div> <h2>Further Reading</h2> <ul> <li><a href="https://help.ubuntu.com/community/Repositories/CommandLine">Repositories and the CommandLine</a></li> <li><a href="http://wiki.ubuntuusers.de/Clipgrab">Clipgrab</a> (German)</li> </ul> vrms - virtual Richard M. Stallman http://martin-thoma.com/vrms-virtual-richard-m-stallman Fri, 23 Dec 2011 00:38:37 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/vrms-virtual-richard-m-stallman <div style="width: 200px" class="wp-caption alignright"><a href="../images/2011/12/Richard-Stallman-200x300.jpg"><img src="../images/2011/12/Richard-Stallman-200x300.jpg" alt="" width="200" height="300" class="size-medium wp-image-10141 "/></a><p class="wp-caption-text"></p></div> <p>I&#39;ve just installed vrms - the virtual richard stallman :D</p> <p><a href="http://en.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a> is an American software freedom activist and computer programmer. He launched the GNU Project to create a free Unix-like operating system, and he has been the project&#39;s lead architect and organizer. With the launch of the GNU Project, he initiated the free software movement; he founded the Free Software Foundation.</p> <div class="highlight"><pre><code class="bash"><span class="nv">$ </span>vrms Non-free packages installed on pc07 rar Archiver <span class="k">for</span> .rar files selfhtml German HTML reference and tutorial unrar Unarchiver <span class="k">for</span> .rar files <span class="o">(</span>non-free version<span class="o">)</span> Contrib packages installed on pc07 nvidia-common Find obsolete NVIDIA drivers ttf-mscorefonts-installer Installer <span class="k">for </span>Microsoft TrueType core fonts 3 non-free packages, 0.2% of 1869 installed packages. 2 contrib packages, 0.1% of 1869 installed packages. </code></pre></div> <p>Thanks to <a href="http://trompetenkaefer.wordpress.com/">trompetenkaefers blog</a> for the post!</p> How to use magic rescue http://martin-thoma.com/how-to-use-magic-rescue Sat, 17 Dec 2011 12:02:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-use-magic-rescue <p>I&#39;ve just searched an image I have created some time ago. I knew that I&#39;ve put it on one of my USB-Sticks, but it seems as if I had deleted it. So how could I get the image back? Magic rescue is a program for recovering deleted files. It doesn&#39;t simply open your trash can, but it searches files which were deleted, but not overwritten.</p> <h2>Installation</h2> <div class="highlight"><pre><code class="bash">sudo apt-get install magicrescue </code></pre></div> <h2>Basic usage</h2> <div class="highlight"><pre><code class="bash"><span class="sb">`</span><span class="nv">$ </span>magicrescue Usage: magicrescue <span class="o">[</span>-I FILE<span class="o">]</span> <span class="o">[</span>-M MODE<span class="o">]</span> <span class="o">[</span>-O <span class="o">[</span>+-<span class="o">=][</span>0x<span class="o">]</span>OFFSET<span class="o">]</span> <span class="o">[</span>-b BLOCKSIZE<span class="o">]</span> -d OUTPUT_DIR -r RECIPE1 <span class="o">[</span>-r RECIPE2 <span class="o">[</span>...<span class="o">]]</span> DEVICE1 <span class="o">[</span>DEVICE2 <span class="o">[</span>...<span class="o">]]</span> -b Only consider files starting at a multiple of BLOCKSIZE. -d Mandatory. Output directory <span class="k">for </span>found files. -r Mandatory. Recipe name, file or directory. -I Read input file names from this file <span class="o">(</span><span class="s2">&quot;-&quot;</span> <span class="k">for </span>stdin<span class="o">)</span> -M Produce machine-readable output to stdout. -O Resume from specified offset <span class="o">(</span>hex or decimal<span class="o">)</span> in the first device. </code></pre></div> <p>You need recipes to use Magic Rescue. These are the basic ones:</p> <div class="highlight"><pre><code class="bash">moose@pc07:/usr/share/magicrescue/recipes<span class="nv">$`</span> ls avi flac gzip mp3-id3v1 nikon-raw ppm canon-cr2 gimp-xcf jpeg-exif mp3-id3v2 perl zip elf gpl jpeg-jfif msoffice png </code></pre></div> <h2>Where is my USB-Stick?</h2> <div class="highlight"><pre><code class="bash"><span class="nv">$ </span>sudo fdisk -l <span class="o">[</span>sudo<span class="o">]</span> password <span class="k">for </span>moose: Disk /dev/sda: 320.1 GB, 320072933376 bytes 255 heads, 63 sectors/track, 38913 cylinders <span class="nv">Units</span> <span class="o">=</span> cylinders of 16065 * <span class="nv">512</span> <span class="o">=</span> 8225280 bytes Sector size <span class="o">(</span>logical/physical<span class="o">)</span>: 512 bytes / 512 bytes I/O size <span class="o">(</span>minimum/optimal<span class="o">)</span>: 512 bytes / 512 bytes Disk identifier: 0x00065e10 Device Boot Start End Blocks Id System /dev/sda1 * 1 37810 303704064 83 Linux /dev/sda2 37810 38914 8864769 5 Extended /dev/sda5 37810 38914 8864768 82 Linux swap / Solaris Disk /dev/sdc: 2067 MB, 2067267584 bytes 2 heads, 63 sectors/track, 32044 cylinders <span class="nv">Units</span> <span class="o">=</span> cylinders of 126 * <span class="nv">512</span> <span class="o">=</span> 64512 bytes Sector size <span class="o">(</span>logical/physical<span class="o">)</span>: 512 bytes / 512 bytes I/O size <span class="o">(</span>minimum/optimal<span class="o">)</span>: 512 bytes / 512 bytes Disk identifier: 0x005f4d47 Device Boot Start End Blocks Id System /dev/sdc1 * 1 32045 2018800 b W95 FAT32 </code></pre></div> <h2>Usage</h2> <div class="highlight"><pre><code class="bash">sudo magicrescue -r png -r jpeg-jfif -r gimp-xcf <span class="se">\</span> -r jpeg-exif -d /home/moose/output/ /dev/sdc1 </code></pre></div> <p>Just got the image back :-) </p> Comparing programming languages http://martin-thoma.com/comparing-programming-languages Sun, 11 Dec 2011 10:50:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/comparing-programming-languages <div style="width: 128px" class="wp-caption alignright"><a href="../images/2011/12/compare-programming-languages.png"><img src="../images/2011/12/compare-programming-languages.png" alt="" width="128" height="128" class="size-full wp-image-9801 "/></a><p class="wp-caption-text"></p></div> <p>If you want to compare programming languages, I can recommend the following links: <ul> <li><a href="http://en.literateprograms.org/">literateprograms.org</a>, </li> <li><a href="http://rosettacode.org/wiki/Rosetta_Code">Rosetta Code</a>, </li> <li><a href="http://www.99-bottles-of-beer.net/abc.html">99-bottles-of-beer.net</a>,</li> <li><a href="http://en.wikipedia.org/wiki/Comparison_of_programming_languages_(basic_instructions)">Comparison of programming languages (basic instructions)</a>, </li> <li><a href="http://en.wikipedia.org/wiki/Comparison_of_programming_languages">Comparison of programming languages</a></li> </ul></p> <p>In particular, I like the following pages: <ul> <li>Fibonacci numbers (<a href="http://en.literateprograms.org/Fibonacci_numbers_%28Python%29">literateprograms</a>, <a href="http://rosettacode.org/wiki/Fibonacci_sequence">rosettacode</a>)</li> <li>Hello World (<a href="http://en.literateprograms.org/Hello_World_%28Python%29">literateprograms</a>, <a href="http://rosettacode.org/wiki/Hello_world">rosettacode</a>)</li> </ul></p> <p>If you want to learn a new language you can look at the implementation of one problem and learn how the new language can be used.</p> OpenID autodiscovery http://martin-thoma.com/openid-autodiscovery Sat, 10 Dec 2011 10:08:56 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/openid-autodiscovery <p><a href="../5-web-technologies-which-should-be-used-more-often/#OpenID">OpenID</a> is a web technology that gives the users the possibility to use one website for authentification on another web service. The <em>OpenID Attribute Exchange</em> makes registration processes simpler, as the user can automatically allow the website to get some information like the Email-adress, the gender and the full name.</p> <p>The next step to an even simpler login process would be autodiscovery. This means there would be no need to do anything for logging in. You simply have to go to the website and be logged at your OpenID provider (e.g. Google). This is quite easily possible if the user was logged in before. You leave a cookie that gives you the information which OpenID he uses. So you simply don&#39;t let him logout. I don&#39;t know if it is a good idea to do so.</p> <p>The registration process is much trickier. Due to the <a href="http://en.wikipedia.org/wiki/Same_origin_policy">same origin policy</a>, you can&#39;t read other cookies than those you have set. So you can&#39;t check if there is a cookie from Google, Facebook or Yahoo.<br/> You could try if the user has a Google account, as Google uses a discovery URL (https://www.google.com/accounts/o8/id) instead of the usual OpenID (something like https://me.yahoo.com/martinthoma). So, by chance you will be able to let a user register without forcing him to interact in any way with your website. He has to allow your website to get his data at his OpenID provider, though.</p> <h2>Futher reading</h2> <ul> <li>Wikipedia: <ul> <li><a href="http://en.wikipedia.org/wiki/OpenID">OpenID</a>: an open standard that describes how users can be authenticated in a decentralized manner, eliminating the need for services to provide their own ad hoc systems and allowing users to consolidate their digital identities</li> <li><a href="http://en.wikipedia.org/wiki/Yadis">Yadis</a>: a communications protocol for discovery of services such as OpenID, OAuth, and XDI connected to a Yadis ID</li> </ul> <p></li> <li><a href="http://openid.net/specs/openid-attribute-exchange-1_0.html">OpenID Attribute Exchange 1.0</a>: Specification</li> <li><a href="https://docs.google.com/document/pub?id=1O7jyQLb7dW6EnJrFsWZDyh0Yq0aFJU5UJ4i5QzYlTjU&pli=1">Guide to Running a User Account System</a>: by Eric Sachs of Google&rsquo;s Identity team</li> </ul></p> Configurig gEdit for developers http://martin-thoma.com/configurig-gedit-for-developers Thu, 08 Dec 2011 22:10:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/configurig-gedit-for-developers <p><a href="http://en.wikipedia.org/wiki/Gedit">gedit</a> is a very lightweight text editor. It supports syntax highlighting for every programming language I can think of and is highly customizable.</p> <p>It belongs to GNOME, but it is also available for Windows. This is how it looks like:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/gedit-screenshot-300x208.png"><img src="../images/2011/12/gedit-screenshot-300x208.png" alt="" width="300" height="208" class="size-medium wp-image-9571"/></a><p class="wp-caption-text"></p></div> <p>You might want to install gedit-plugins:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install gedit-plugins </code></pre></div> <h2>External Tools</h2> <p>gedit allows you to run external command line tools by pressing shortcuts. You can find the external tools plugins in your preferences: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/gedit-external-tools1-300x209.png"><img src="../images/2011/12/gedit-external-tools1-300x209.png" alt="" width="300" height="209" class="size-medium wp-image-9601"/></a><p class="wp-caption-text"></p></div></p> <p>You can assign shortcuts by clicking into an input field and simply using the shortcut once: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/12/external-tool-java-300x209.png"><img src="../images/2011/12/external-tool-java-300x209.png" alt="" width="300" height="209" class="size-medium wp-image-9611"/></a><p class="wp-caption-text"></p></div></p> <h3>Java</h3> <div class="highlight"><pre><code class="bash"><span class="c">#!/bin/sh</span> <span class="nb">cd</span> <span class="sb">`</span><span class="nv">$GEDIT_CURRENT_DOCUMENT_DIR</span> <span class="k">if </span>javac <span class="nv">$`</span>GEDIT_CURRENT_DOCUMENT_NAME<span class="p">;</span> <span class="k">then</span> java <span class="k">${</span><span class="nv">GEDIT_CURRENT_DOCUMENT_NAME</span><span class="p">%\.java</span><span class="k">}</span> <span class="k">else</span> <span class="nb">echo</span> <span class="s2">&quot;Failed to compile&quot;</span> <span class="k">fi</span> </code></pre></div> <h2>Code Comment</h2> <p>This neat little plugin detects which programming language you are using. If you select a code block and press ctrl+m it gets marked as a comment. If you press ctrl+shift+m a block of comments gets &quot;decommented&quot; to a block of code. It uses # for Python and // for Java.</p> <h2>Bracket Completion</h2> <p>Well, I guess the name is meaningful, isn&#39;t it? As soon as you type a bracket - (, [ or { it gets completed with }, ] or ).</p> <h2>Better Python Console</h2> <p>The <a href="http://live.gnome.org/Gedit/Plugins/BetterPythonConsole">Better Python Console Plugin</a> allows you to press F5 and execute the current code in an interactive Python console. This means, you can access the current variables!</p> <p>You install it by extracting and copying the whole folder (with plugins!) to ~/gnome2/gedit.</p> <h2>What could be better</h2> <p>The design could be simmilar to Chrome :-) So they could have some nicer tabs. Nothing really important.</p> <p>I really miss comment folding since I have to write Java code with a lot of Doc comments</p> <h2>Further reading and ressources</h2> <ul> <li><a href="http://projects.gnome.org/gedit/">Official Website</a>: You can find the Windows Binary here.</li> <li><a href="http://live.gnome.org/Gedit/ExternalToolsPluginCommands">External Tools</a></li> <li><a href="http://www.makeuseof.com/tag/top-plugins-to-extend-and-make-gedit-a-more-useful-text-editor-linux/">13 Gedit Plugins to Make It a More Useful Text Editor</a>: Seems as if you could also have a class browser in gedit</li> </ul> for loops in different programming languages http://martin-thoma.com/for-loops-in-different-programming-languages Sun, 04 Dec 2011 10:19:54 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/for-loops-in-different-programming-languages <p>If you have to learn a new programming language it is most of the time quite easy. You know the structures and the way you have to think if you want to solve a problem. The first time it might be hard, but the more languages you learn the more simmilarities you&#39;ll recognize.</p> <p>I also have to learn a special variant of <a href="http://en.wikipedia.org/wiki/Pseudocode">pseudocode</a> at the moment. It is quite hard to know what pseudocode does if it isn&#39;t unambiguously defined. I had problems with for loops for example.</p> <p>For loops have some properties you simply have to define: <ul> <li><strong>Scoping</strong>: Does the loop counter still exist after the loop was executed?</li> <li><strong>Copy or reference</strong>: Does the loop statement work with a copy or with a reference of the variables in the loop body?</li> <li><strong>Last value of i</strong>: What is the last value of i?</li> </ul></p> <h2>General structure</h2> <p>A for loop usually consists of an initialisation part, a condition and an interation step:</p> <div style="width: 285px" class="wp-caption aligncenter"><a href="../images/2011/11/for-loop-structure1.png"><img src="../images/2011/11/for-loop-structure1.png" alt="" width="285" height="176" class="size-full wp-image-9251"/></a><p class="wp-caption-text"></p></div> <h2>Pythons special strutcure</h2> <p>Python uses a generator or lists to loop:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;In loop: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Out of loop: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">)</span> </code></pre></div> <h2>Scoping</h2> <p>Does the loop counter still exist after the loop was executed? <ul> <li><strong>Yes</strong>: JavaScript, PHP, Python</li> <li><strong>No</strong>: C, C++, Java</li> </ul></p> <h2>Copy or reference</h2> <p>Does the loop statement work with a copy or with a reference of the variables in the loop body? Does the programming language use the same variable as in the for condition (reference) or does it use another one (copy)? You can test this if you add something to i in the body. <ul> <li><strong>Copy</strong>: Python</li> <li><strong>Reference</strong>: C, C++, Java, JavaScript, PHP</li> </ul></p> <p>Python iterates over a generator. This means that you can&#39;t really compare Pythons for-loop to other programming languages&#39; for loops.</p> <h2>Last value of i</h2> <p>What is the last value of i?</p> <p><strong>9</strong>: C, C++, Java (Inside the loop), Python (Outside of the loop) <strong>10</strong>: JavaScript, PHP (Outside of the loop)</p> <h2>foreach</h2> <p>Many languages provide a special for loop. This special for loop is sometimes called &quot;foreach&quot; as you iterate over each element in a collection (e.g. an array).</p> <h3>Java</h3> <div class="highlight"><pre><code class="java"><span class="kt">int</span><span class="o">[]</span> <span class="n">array</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="mi">5</span><span class="o">];</span> <span class="n">array</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">array</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">array</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span> <span class="n">array</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">array</span><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="nl">item:</span> <span class="n">array</span><span class="o">)</span> <span class="o">{</span> <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Foreach: &quot;</span> <span class="o">+</span> <span class="n">item</span><span class="o">);</span> <span class="o">}</span> </code></pre></div> <h3>JavaScript</h3> <div class="highlight"><pre><code class="javascript"><span class="kd">var</span> <span class="nx">array</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">array</span><span class="p">)</span> <span class="p">{</span> <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s1">&#39;Foreach: &#39;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s1">&#39;&lt;br/&gt;&#39;</span> <span class="p">);</span> <span class="p">}</span> </code></pre></div> <h3>PHP</h3> <p>[php]`$array = array(0, 1, 2, 3, 4);</p> <p>foreach ($<code>array as</code>$key=&gt;$`value) { echo &quot;Foreach: $value<br/>&quot;; }[/php]</p> <h3>Python</h3> <div class="highlight"><pre><code class="python"><span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">array</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;Foreach: </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">value</span> </code></pre></div> <h2>More information</h2> <p>If you want to see the code, you can download this <a href='../images/2011/12/for-loops.zip'>zip archive</a>.</p> <p>It is quite astonishing, but Wikipedia has a very long <a href="http://en.wikipedia.org/wiki/For_loop">article about for loops</a>.</p> Checkstyle http://martin-thoma.com/checkstyle Wed, 30 Nov 2011 20:59:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/checkstyle <div class="highlight"><pre><code class="text language-text" data-lang="text">&lt;li&gt;&lt;/li&gt; </code></pre></div> <p>I have to go to a programming course at KIT at the moment where we are taught how to program with Java. They create exercises which get evaluated automatically. One part of the evaluation is checkstyle.</p> <p>So it is a good idea to test the files on my machine before uploading them.</p> <h2>Installation</h2> <p>You can install it on an Ubuntu system with this command:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install checkstyle </code></pre></div> <h2>Usage</h2> <p>You can call checkstyle with this command:</p> <div class="highlight"><pre><code class="bash">checkstyle -c /usr/share/checkstyle/sun_checks.xml YourCode.java </code></pre></div> <p>Another example would be:</p> <div class="highlight"><pre><code class="bash">checkstyle -c /path/to/config/Progr_WS11_Checkstyle1.xml KITBook.java </code></pre></div> <p>It will generate some output similar to this:</p> <div class="highlight"><pre><code class="bash">Starting audit... KITBook.java:173:64: <span class="s1">&#39;{&#39;</span> is not preceded with whitespace. KITBook.java:174:69: <span class="s1">&#39;-&#39;</span> is not preceded with whitespace. KITBook.java:174:70: <span class="s1">&#39;-&#39;</span> is not followed by whitespace. Audit <span class="k">done</span>. </code></pre></div> <h2>Resolve warnings</h2> <div class="highlight"><pre><code class="bash"><span class="o">[</span>warning<span class="o">]</span> /usr/bin/checkstyle: No java runtime was found <span class="o">[</span>warning<span class="o">]</span> /usr/bin/checkstyle: No JAVA_CMD <span class="nb">set </span><span class="k">for </span>run_java, falling back to <span class="nv">JAVA_CMD</span> <span class="o">=</span> java </code></pre></div> <p>You have to set the path:</p> <div class="highlight"><pre><code class="bash"><span class="nv">JAVA_CMD</span><span class="o">=</span>/usr/lib/jvm/java-6-sun/bin/java <span class="nb">export </span>JAVA_CMD </code></pre></div> <h2>Check all files in a folder</h2> <div class="highlight"><pre><code class="bash">checkstyle -c /home/moose/Downloads/Progr_WS11_Checkstyle1.xml -r . </code></pre></div> <h2>Checkstyle and eclipse</h2> <p>Go to <code><u>H</u>elp &rarr; Install New <u>S</u>oftware ...</code> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/eclipse-path-updates-300x173.png"><img src="../images/2011/11/eclipse-path-updates-300x173.png" alt="" width="300" height="173" class="size-medium wp-image-9671"/></a><p class="wp-caption-text"></p></div></p> <p>Install <code>http://eclipse-cs.sf.net/update/</code> as a new &quot;repository&quot;.</p> <p>After you have installed the plugin, you have to activate it for your project. To do so, you have to go to <code><u>P</u>roject &rarr; <u>P</u>roperties</code> and check <code>Checkstyle active for this project</code>. Then you have to change to the <code>Local Check Configurations</code> tab and load your personal checkstyle xml files. </p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/eclipse-checkstyle-properties-300x104.png"><img src="../images/2011/11/eclipse-checkstyle-properties-300x104.png" alt="" width="300" height="104" class="size-medium wp-image-9681"/></a><p class="wp-caption-text"></p></div> <p>Click on <code>New</code>, give it a name and click on <code>import</code>. Go back to the main tab and use your personal checkstyle. You will have to rebuild the project.</p> <p>You might want to use more than one checkstyle file. You can do that if you uncheck <code>Use simple configuration</code>:</p> <div style="width: 598px" class="wp-caption aligncenter"><a href="../images/2011/11/eclipse-checkstyle-multiple-files.png"><img src="../images/2011/11/eclipse-checkstyle-multiple-files.png" alt="" width="598" height="265" class="size-full wp-image-9711"/></a><p class="wp-caption-text"></p></div> <p>Now you can set <code>File Set Configuration</code> to <code>All</code>, select your <code>Check Configuration</code>, click on <code>OK</code> and enable it in the <code>Main</code> tab.</p> <h2>Further reading and resources </h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Checkstyle">Wikipedia</a></li> <li><a href="http://checkstyle.sourceforge.net/index.html">Official Website</a></li> </ul> <h3>KIT</h3> <p>If you are a student at KIT and you can download the KIT checkstyle-files from <a href="http://zvi.ipd.kit.edu/lehre_programmieren_ws11.php#Zusaetzliches_Material">zvi.ipd.kit.edu</a>. If you can&#39;t do it from home via VPN, you could use SSH.</p> <p>These commands work fine on Ubuntu and I guess on every Linux machine. If you use Windows, you will have to install Putty or something similar.</p> <p>Login with your personal account that begins with u. I&#39;ll use uabcd in this example.</p> <div class="highlight"><pre><code class="bash">ssh uabcd@rzstud.stud.uni-karlsruhe.de </code></pre></div> <p>Then download the files with wget:</p> <div class="highlight"><pre><code class="bash">wget ftp://ftp.ira.uka.de/pub/ZVI/KIT/programmieren_ws11/material/Progr_WS11_Checkstyle1.xml wget ftp://ftp.ira.uka.de/pub/ZVI/KIT/programmieren_ws11/material/Progr_WS11_Checkstyle2.xml </code></pre></div> <p>Now you can exit the bash with <code>exit</code> and download the files from your account with <code>scp</code>:</p> <div class="highlight"><pre><code class="bash">scp uabcd@rzstud.stud.uni-karlsruhe.de:~/Progr_WS11_Checkstyle1.xml ~/Progr_WS11_Checkstyle1.xml scp uabcd@rzstud.stud.uni-karlsruhe.de:~/Progr_WS11_Checkstyle1.xml ~/Progr_WS11_Checkstyle1.xml </code></pre></div> How to create a color scheme http://martin-thoma.com/how-to-create-a-color-scheme Fri, 11 Nov 2011 07:22:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-create-a-color-scheme <p>Here are some nice online tools to create color schemes</p> <h2>Color Rotate</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/color-rotate-300x263.png"><img src="../images/2011/11/color-rotate-300x263.png" alt="" width="300" height="263" class="size-medium wp-image-9011"/></a><p class="wp-caption-text"></p></div> <h2>Color Scheme Designer</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/color-scheme-designer-300x198.png"><img src="../images/2011/11/color-scheme-designer-300x198.png" alt="" width="300" height="198" class="size-medium wp-image-8991"/></a><p class="wp-caption-text"></p></div> <h2>Color Jack</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/color-jack-sphere-300x174.png"><img src="../images/2011/11/color-jack-sphere-300x174.png" alt="" width="300" height="174" class="size-medium wp-image-9021"/></a><p class="wp-caption-text"></p></div> <h2>Pictaculous</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/Pictaculous1-300x240.png"><img src="../images/2011/11/Pictaculous1-300x240.png" alt="" width="300" height="240" class="size-medium wp-image-8711"/></a><p class="wp-caption-text"></p></div> <h2>4096 Color Wheel</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/4096-color-wheel-300x242.png"><img src="../images/2011/11/4096-color-wheel-300x242.png" alt="" width="300" height="242" class="size-medium wp-image-8951"/></a><p class="wp-caption-text"></p></div> <h2>Kuler</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/kuler-300x210.png"><img src="../images/2011/11/kuler-300x210.png" alt="" width="300" height="210" class="size-medium wp-image-8961"/></a><p class="wp-caption-text"></p></div> <h2>Colour Lovers</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/colour-lovers-300x223.png"><img src="../images/2011/11/colour-lovers-300x223.png" alt="" width="300" height="223" class="size-medium wp-image-8981"/></a><p class="wp-caption-text"></p></div> <h2>Color Blender</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/11/color-blender-300x240.png"><img src="../images/2011/11/color-blender-300x240.png" alt="" width="300" height="240" class="size-medium wp-image-9031"/></a><p class="wp-caption-text"></p></div> Eine Sprache ist nicht regulär - Beweis mit dem Pumping-Lemma http://martin-thoma.com/pumping-lemma Thu, 10 Nov 2011 15:05:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/pumping-lemma <p>Regul&auml;re Sprachen k&ouml;nnen von endlichen Automaten erkannt werden. Das bedeutet, dass eine endliche Anzahl an Zust&auml;nden ausreicht, um ein Wort der Sprache zu akzeptieren. Wenn also eine Sprache <code>$L = \{a^i b^{2i} | i \in \mathbb{N}\}$</code> beschrieben wird, m&uuml;sste gez&auml;hlt werden, wie oft a vorkommt. a kann aber beliebig oft vorkommen. Das ist ein Indiz daf&uuml;r, dass es sich nicht um eine regul&auml;re Sprache handelt.</p> <p>Das <a href="http://de.wikipedia.org/wiki/Pumping-Lemma">Pumping-Lemma</a> ist ein notwendiges, aber kein hinreichendes Kriterium f&uuml;r regul&auml;re Sprachen. Daraus folgt, dass eine nicht-regul&auml;re Sprache eventuell durch das Lemma entlarvt werden kann. Allerdings muss nicht jede Sprache, die das Pumping-Lemma erf&uuml;llt, regul&auml;r sein.</p> <p>Dies kann man durch einen Widerspruchsbeweis zeigen. Dabei nimmt man an, dass die Behauptung falsch ist. Dann zeigt man, dass man durch die Annahme zu einem Widerspruch kommt.</p> <h2>Beispiel</h2> <p><strong>Voraussetzung</strong>: </p> <p><code>$L_2 = \{a^i b^j c^k | i \lt j \lt k\}$</code>.</p> <p><strong>Behauptung</strong>: <code>$L_2$</code> ist nicht regul&auml;r.</p> <p><strong>Beweis</strong>: (durch Widerspruch)</p> <p><strong>Annahme</strong>: <code>$L_2$</code> sei regul&auml;r.</p> <p>Aus dem Pumping-Lemma folgt: <code>$\exists n \in \mathbb{N}: \forall w \in \{w \in L_2 | |w| \geq n\}: $</code> <code>$\exists \text{ Darstellung } uvx = w \text{ mit } v \neq \varepsilon \land |uv| \leq n$</code> f&uuml;r die gilt:</p> <p><code>$uv^i x \in L_2 \forall i \in \mathbb{N}_0$</code></p> <p>In Worten: Wenn man ein Wort in L hat, dass mindestens so lang ist wie ein bestimmtes n, dann kann man dieses Wort in Teilworte u, v und x zerlegen. Bei dieser Zerlegung ist v niemals leer. Wenn man nun den Teil des Wortes, der in v steckt wiederholt, muss das Wort immer noch in <code>$L_2$</code> sein.</p> <p>Sei <code>$n \in \mathbb{N}$</code> die Konstante aus dem Pumping-Lemma.</p> <p>Betrachte nun <code>$w = a^n b^{n+1} c^{n+2}$</code>. Offensichtlich gilt <code>$w \in L_2$</code>. Da <code>$|uv| \leq n$</code> muss in v mindestens ein a sein. </p> <p><code>$\Rightarrow uv^2 x = a^{n+2 \cdot i} b^{n+1} c^{n+2}, i \geq 1 $</code> <code>$\Rightarrow uv^2x \notin L_2 $</code> <code>$\Rightarrow \text{Widerspruch} $</code> <code>$\Rightarrow \text{Die Annahme war falsch.} $</code> <code>$\Rightarrow L_2$</code> ist nicht regul&auml;r.</p> <p><em>Bemerkung</em>: Eigentlich ist es ein Beweis durch Kontraposition. Man wei&szlig;, es gilt: <code>$L \in {\cal L_3} \Rightarrow $</code> L erf&uuml;llt das Pumping-Lemma. Daraus folgt: L erf&uuml;llt nicht das Pumping-Lemma <code>$\Rightarrow L \notin {\cal L_3}$</code>. Um zu beweisen, dass L das Pumping-Lemma nicht erf&uuml;llt, benutzt man meist einen Widerspruchsbeweis wie oben.</p> <h2>Material</h2> <p>Ich habe mal ein paar <a href='../images/2011/11/odgen-pumping.zip'>Beispiele f&uuml;r Ogdens Lemma und das Pumping-Lemma</a> gesammelt.</p> Python Generators http://martin-thoma.com/python-generators Thu, 10 Nov 2011 07:24:00 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-generators <p>Python has a quite mighty tool: Generators.</p> <p>Generators help you to program interators. They look almost like normal functions, but they have yield as a special keyword. yield is used instead of return.</p> <p>Imagine you wanted to display n fibonacci numbers. This could be your normal approach:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Build and return a list of the first </span> <span class="sd"> n &gt;= 2 Fibonacci numbers &quot;&quot;&quot;</span> <span class="n">fibList</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">fibList</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span> <span class="n">newFib</span> <span class="o">=</span> <span class="n">fibList</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">fibList</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="n">fibList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">newFib</span><span class="p">)</span> <span class="k">return</span> <span class="n">fibList</span> <span class="k">for</span> <span class="n">nr</span><span class="p">,</span> <span class="n">fib</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">fibonacci</span><span class="p">(</span><span class="mi">100</span><span class="p">)):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;The </span><span class="si">%i</span><span class="s">-th Fibonacci-Nr is </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nr</span><span class="p">,</span> <span class="n">fib</span><span class="p">))</span> </code></pre></div> <p>The disadvantage of this approach is that you have to keep every element of the sequence in memory. Of course, you could write something like this:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot; Calculate the n-th fibonacci number. &quot;&quot;&quot;</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">elif</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="k">for</span> <span class="n">nr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;The </span><span class="si">%i</span><span class="s">-th Fibonacci-Nr is </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nr</span><span class="p">,</span> <span class="n">fib</span><span class="p">(</span><span class="n">nr</span><span class="p">)))</span> </code></pre></div> <p>This needs much less memory, but much more time. You have to recalculate the first few fibonacci numbers every time.</p> <p>A generator could look like this:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="k">def</span> <span class="nf">fibGenerator</span><span class="p">():</span> <span class="sd">&quot;&quot;&quot; A python fibonacci generator &quot;&quot;&quot;</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> <span class="k">yield</span> <span class="n">a</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="n">myGenerator</span> <span class="o">=</span> <span class="n">fibGenerator</span><span class="p">()</span> <span class="k">for</span> <span class="n">nr</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">100</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;The </span><span class="si">%i</span><span class="s">-th Fibonacci-Nr is </span><span class="si">%i</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nr</span><span class="p">,</span> <span class="n">myGenerator</span><span class="o">.</span><span class="n">next</span><span class="p">()))</span> </code></pre></div> <h2>Further Reading</h2> <ul> <li><a href="http://docs.python.org/tutorial/classes.html#generators">Python documentation</a></li> <li><a href="http://wiki.python.org/moin/Generators">Python Wiki</a></li> </ul> Wie führe ich einen Induktionsbeweis? http://martin-thoma.com/wie-fuhre-ich-einen-induktionsbeweis Tue, 01 Nov 2011 00:29:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-fuhre-ich-einen-induktionsbeweis <p>Der Induktionsbeweis eignet sich h&auml;ufig, wenn es um Aussagen &uuml;ber die Nat&uuml;rlichen Zahlen <code>$\mathbb{N}$</code> geht, allerdings kann er auch f&uuml;r die ganzen Zahlen <code>$\mathbb{Z}$</code> verwendet werden.</p> <h2>Prinzip</h2> <p>Der Gedanke hinter dem Induktionsbeweis ist, dass man sehr leicht f&uuml;r ein einzelnes Element zeigen kann, dass eine Aussage gilt. Diese Aussage ist die Behauptung. Dann zeigt man allgemein, wenn die Aussage f&uuml;r eine Zahl gilt muss sie auch f&uuml;r die n&auml;chste Zahl gelten.</p> <p>Wenn man also f&uuml;r n = 1 zeigt dass die Aussage A(n) korrekt ist, dann gilt sie f&uuml;r alle positiven Zahlen.</p> <h2>Aufbau</h2> <ul> <li><strong>Induktionsanfang</strong> (I.A.): Zeige, dass die Aussage f&uuml;r ein bestimmtes `$n_0$` (also z.B. `$n_0 = 0$`) gilt. Daf&uuml;r muss man einfach nur einsetzen.</li> <li><strong>Induktionsvorraussetzung</strong> (I.V.)): "Sei `$n \in \mathbb{N}$` beliebig, aber fest und es gelte: <Aussage>"</li> <li><strong>Induktionsschluss</strong> (I.S.): Ausgehend von I.V. ist zu zeigen, dass die Aussage f&uuml;r `$n_0 + 1$` gilt.</li> </ul> <h2>Beispiele</h2> <h3>Identit&auml;ten</h3> <p>Es gibt viele Identit&auml;ten, die sich gut mit einem Induktionsbeweis zeigen lassen: Bei den folgenden Identit&auml;ten sei <code>$n \in \mathbb{N}$</code>.</p> <h4>Gau&szlig;sche Summenformel</h4> <p><strong>Behauptung</strong>: <code>$\sum_{k=1}^n k = \frac{1}{2} \cdot n \cdot (n+1)$</code> <strong>Beweis</strong>: durch vollst&auml;ndige Induktion <strong>I.A.</strong>: Sei n = 1. Dann: <code>$\sum_{k=1}^1 k = 1 = \frac{1}{2} \cdot 1 \cdot (1+1)$</code> <strong>I.V.</strong>: Sei <code>$n \in \mathbb{N}$</code> beliebig, aber fest und es gelte: <code>$\sum_{k=1}^n k = \frac{1}{2} \cdot n \cdot (n+1)$</code> <strong>I.S.</strong>: <code>$\sum_{k=1}^{n+1} k = \sum_{k=1}^{n} k + (n+1) \stackrel{I.V.}{=} \frac{1}{2} \cdot n \cdot (n+1) + (n+1) = $</code> <code>$= \frac{1}{2} \cdot (n^2 + n) + (n+1) = \frac{1}{2} \cdot (n^2 + 3n + 2) = \frac{1}{2} \cdot (n+1)(n+2) \blacksquare$</code></p> <h4>Weitere</h4> <ol type="i" style="list-style-type:lower-roman"> <li>`$\sum_{k=1}^n k^3 = \frac{1}{4}n^2 (n+1)^2$`</li> <li>Fibonacci: `$f(m+n) = f(n+1) \cdot f(m) + f(n) \cdot f(m-1)$`</li> </ol> <h3>Binomischer Satz</h3> <p>Das folgende habe ich als Mitschrift der Vorlesung &quot;Analysis I&quot; am KIT gemacht:</p> <div style="background-color:#FFFF66;border:2px solid #FF0000;padding:5px;"> Seien `$a, b \in \mathbb{R}.$` Dann gilt f&uuml;r alle `$n \in \mathbb{N}$`: `$(a+b)^{n+1} = (a+b)(a+b)^n = (a+b) \underbrace{\sum_{k=0}^{n} \binom{n}{k} a^{n-k} b^k}_\text{Binomischer Lehrsatz}$` </div> <p><strong>I.A.</strong>: <code>$n=1: \sum_{k=0}^{1}\binom{1}{k} a^{1-k} b^k = (a+b)^n$</code></p> <p><strong>I.V.</strong>: Sei <code>$n \in \mathbb{N}$</code> und es gelte <code>$(a+b)^{n+1} = (a+b)(a+b)^n = (a+b) \sum_{k=0}^{n} \binom{n}{k} a^{n-k} b^k$</code></p> <p><strong>I.S.</strong>: <code>$ \begin{align} (a+b)^{k+1} &amp;= (a+b)(a+b)^n \\ &amp;= (a+b) \sum_{k=0}^{n} \binom{n}{k} a^{n-k} b^k \\ &amp;= \sum_{k=0}^{n} \binom{n}{k} a^{n+1-k} b^k + \sum_{k=0}^n \binom{n}{k} a^{n-k} b^{k+1} \\ &amp;= \underbrace{\binom{n}{0}}_{\binom{n+1}{0}} a^{n+1} + \sum_{k=1}^n \binom{n}{k} a^{n+1-k} b^k + \underbrace{\sum_{k=0}^{n-1} \binom{n}{k} a^{n-k} b^{k+1}}_\text{Vorbemerkung} + \binom{n}{n} b^{n+1} \\ &amp;= \binom{n+1}{0} a^{n+1} + \sum_{k=1}^{n} [\binom{n}{k} + \binom{n}{k-1}] a^{n+1} b^k + \binom{n+1}{n+1} b^{n+1} \\ &amp;= \sum_{k=0}^{n+1} \binom{n+1}{k} a^{n+1-k} b^k \end{align}$</code></p> <h3>Rekursive Folgen</h3> <p>Der Grenzwert rekursiv definierter Folgen l&auml;sst sich h&auml;ufig sehr sch&ouml;n mit mehreren Induktionsbeweisen beweisen.</p> <ol> <li>Finde f&uuml;r dich heraus: Ist die Folge monoton steigend oder fallend? ist 0 oder 1 eine untere / obere Schranke? gibt es andere untere oder obere Schranken?</li> <li>Beweise, dass du eine obere / untere Schranke gefunden hast</li> <li>Beweise, dass die Folge monoton steigt / f&auml;llt</li> <li>Mache den Ansatz: Sei `$a$` der Grenzwert der Folge `$(a_n)_{n \in \mathbb{N}}$` mit `$a_n = f(a_{n-1})$`. Dann gilt: `$a = f(a)$`. L&ouml;se dann nach `$a$` auf.</li> </ol> <p>Eine Folge in der das wunderbar klappt ist folgende:</p> <p>Sei <code>$(a_n)_{n \in \mathbb{N}}$</code> eine Folge und definiert durch: <code>$a_0 = 2,~~~~~ a_n = \sqrt[3]{a_n^2+a_n-1}$</code>.</p> <h2>Strukturelle Induktion</h2> <p>Bei der vollst&auml;ndigen Induktion iteriert man &uuml;ber eine nat&uuml;rliche Zahl und gelangt so, ab einer festen nat&uuml;rlichen Zahl <code>$n_0$</code> zu jeder beliebigen gr&ouml;&szlig;eren nat&uuml;rlichen Zahl.</p> <p>Die strukturelle Induktion nutzt allerdings nicht direkt Zahlen, sondern strukturen. Man hat eine sog. &quot;Atomare Struktur&quot; bzw. &quot;Atomares Element&quot;, also in einem gewissen Sinn das oder die kleinsten Teilchen, gegeben. Diese Teilchen erf&uuml;llen die Aussage. Nun zeigt man, dass aus den Atomaren Elementen alle Strukturen gebildet werden k&ouml;nnen, &uuml;ber die in der Behauptung die Aussage getroffen wird und dass die Aussage bei jeder neuen Struktur richtig ist.</p> <p>Insbesondere bietet sich die strukturelle Induktion bei komplexen Graphen, aussagelogischen Formeln und W&ouml;rtern an.</p> <h3>Beispiele</h3> <h4>Voller, vollst&auml;ndiger Bin&auml;rbaum</h4> <p>Sei G(V, E) ein Bin&auml;rbaum.</p> <p>G ist ein voller Bin&auml;rbaum <code>$: \Leftrightarrow$</code> alle inneren Knoten von G haben den Verzweigungsgrad 2 G ist ein voller, vollst&auml;ndiger Bin&auml;rbaum <code>$: \Leftrightarrow$</code> G ist ein voller Bin&auml;rbaum und alle Bl&auml;tter haben die gleiche H&ouml;he</p> <p><strong>Behauptung</strong> <code>${\cal B} (n)$</code>: Jeder volle, vollst&auml;ndige Bin&auml;rbaum der H&ouml;he <code>$n, n \in \mathbb{N}$</code> hat <code>$2^{n-1} - 1$</code> innere Knoten. <strong>Beweis</strong>: durch strukturelle Induktion <strong>I.A.</strong>: zeige <code>${\cal B} (1)$</code>. Ein voller, vollst&auml;ndiger Bin&auml;rbaum der H&ouml;he n = 1 besteht nur aus einem Knoten. Er hat also <code>$0 = 2^{n-1} - 1 = 2^{1-1} - 1 = 2^0 - 1 = 1 - 1 = 0$</code> innere Knoten. <strong>I.V.</strong>: F&uuml;r beliebige, aber feste volle, vollst&auml;ndige Bin&auml;rb&auml;ume G der H&ouml;he n gilt: G hat <code>$2^{n-1} - 1$</code> innere Knoten. <strong>I.S.</strong>: zeige <code>${\cal B} (n+1)$</code> F&uuml;r jeden vollen, vollst&auml;ndigen Bin&auml;rbaum der H&ouml;he <code>$n+1$</code> gibt es einen Teilgraphen T, der ein voller, vollst&auml;ndiger Bin&auml;rbaum der H&ouml;he n ist. <code>$\stackrel{I.V.}{\Rightarrow}$</code> T hat <code>$2^{n-1} - 1$</code> innere Knoten. Das sind auch innere Knoten von G. Da die H&ouml;he von G um eins h&ouml;her ist als die von T und sowohl G als auch T volle, vollst&auml;dige Bin&auml;rbaume sind, kommen zu jedem der <code>$2^{n-1}$</code> Bl&auml;tter aus T noch 2 Bl&auml;tter. Dadurch hat G genau <code>$2^{n-1}$</code> innere Knoten mehr als T <code>$\Rightarrow$</code> G hat <code>$2^{n-1}-1+2^{n-1} = 2^n - 1$</code> innere Knoten <code>$\blacksquare$</code></p> <h4>Aussagenlogische Ausdr&uuml;cke</h4> <p>Die Idee habe ich aus dem <a href="http://www.matheboard.de/archive/470377/thread.html">Matheboard</a> von &quot;MoeMoeson&quot;. Bei diesem Beweis bin ich mir aber nicht sicher, ob es tats&auml;chlich strukturelle Induktion ist :-/</p> <p>Definition: Aussagenlogischer Ausdruck <ol type="i" style="list-style-type: lower-roman;"> <li>Jede Variable <code>$p_i, i \in \mathbb{N}$</code> ist ein aussagenlogischer Ausdruck &uuml;ber V.</li> <li>Sind A und B aussagenlogische Ausdr&uuml;cke &uuml;ber V, so sind auch <code>$\neg A, A \land B, A \lor B, A \Rightarrow B, A \Leftrightarrow B, (A)$</code>.</li> <li>Ein Wort &uuml;ber V ist nur dann ein aussagenlogischer Ausdruck &uuml;ber V, falls dies aufgrund endlich oftmaliger Anwendung von (i) und (ii) der Fall ist.</li> </ol></p> <p><strong>Behauptung</strong> Jeder aussagenlogischer Ausdruck endet entweder auf eine Variable oder auf eine schlie&szlig;ende Klammer. <strong>Beweis</strong>: durch strukturelle Induktion <strong>I.A.</strong>: Jeder aussagenlogischer Ausdruck aus (i) endet auf eine Variable. <strong>I.V.</strong>: F&uuml;r beliebige, aber feste aussagenlogische Ausdr&uuml;cke A gilt: A endet auf eine Variable oder eine schlie&szlig;ende Klammer. <strong>I.S.</strong>: Ein aussagenlogischer Ausdruck kann nur durch endlich h&auml;ufige Anwendung von (i) und (ii) erzeugt werden (vgl. (iii)). (i) erf&uuml;llt die Bedingung laut I.V., (ii) auch. <code>$\blacksquare$</code></p> <p><strong>Behauptung</strong> F&uuml;r jeden aussagenlogischen Ausdruck A gibt es einen &auml;quivalenten aussagenlogischen Ausdruck B, der nur <code>$\neg$</code> und <code>$\land$</code> als Operatoren verwendet. <strong>Beweis</strong>: durch strukturelle Induktion <strong>I.A.</strong>: Seien <code>$p_1, p_2$</code> aussagenlogische Variablen. Dann gilt: <code>$p_1 \lor p_2 = \neg (\neg p_1 \land \neg p_2)$</code> <code>$p_1 \Leftrightarrow p_2 = \neg (p_1 \land \neg p_2) \land \neg (\neg p_1 \land p_2)$</code> <code>$p_1 \Rightarrow p_2 = p_1 \land \neg p_2$</code> F&uuml;r alle weiteren Ausdr&uuml;cke aus (i) und (ii) gilt die Behauptung offensichtlich.</p> <p><strong>I.V.</strong>: F&uuml;r beliebige, aber feste aussagenlogische Ausdr&uuml;cke A gilt: Es gibt einen &auml;quivalenten aussagenlogischen Ausdruck B, der nur <code>$\neg$</code> und <code>$\land$</code> als Operatoren verwendet. <strong>I.S.</strong>: Ein aussagenlogischer Ausdruck kann nur durch endlich h&auml;ufige Anwendung von (i) und (ii) erzeugt werden (vgl. (iii)). (i) und (ii) erf&uuml;llen die Bedingung laut I.V.. <code>$\blacksquare$</code></p> <h2>Unendlich - Wann Induktion nicht funktioniert</h2> <p>Mit Induktion kann man Aussagen f&uuml;r beliebig gro&szlig;e/kleine ganze Zahlen treffen. Allerdings eben nur f&uuml;r ganze Zahlen. Unendlich ist keine ganze Zahl. Also kann man auch keine Aussagen f&uuml;r &quot;unendliche Aussagen&quot; treffen.</p> <p>Hier ein Beispiel:</p> <p>Sei A eine Menge. A hei&szlig;t offen <code>$:\Leftrightarrow \forall_{x \in A} : \exists_{\delta = \delta(x) &gt; 0} : U_\delta(x) \subseteq A$</code> Es gilt: U und V sind offene Mengen <code>$\Rightarrow U \cap V$</code> ist offen.*</p> <p>Nun k&ouml;nnte man den Trugschluss machen, dass der Schnitt unendlich vieler offener Mengen auch offen ist. Der <strong>falsche Induktionsbeweis</strong> w&uuml;rde in etwa so aussehen:</p> <p><strong>Voraussetungen:</strong> Seien <code>$M_i, i \in \mathbb{N}_0$</code> offene Mengen. Sei M eine Menge und definiert durch <code>$M := \displaystyle \bigcap_{i=0}^\infty M_i$</code>. <strong>Behauptung</strong>: M ist offen. <strong>Beweis</strong>: durch vollst&auml;ndige Induktion <strong>I.A.</strong>: Sei n = 1. Dann: <code>$\cap_{i=0}^1 M_i = M_0 \cap M_1$</code> ist laut * offen. <strong>I.V.</strong>: Sei <code>$n \in \mathbb{N}$</code> beliebig, aber fest und es gelte: <code>$\displaystyle \bigcap_{i=0}^n M_i$</code> ist offen. <strong>I.S.</strong>: <code>$\displaystyle \bigcap_{i=0}^{n+1} M_i = \bigcap_{i=0}^{n} M_i \cap M_{n+1}$</code>. Nun gilt: <code>$\displaystyle \bigcap_{i=0}^{n} M_i$</code> ist per I.V. offen. <code>$M_{n+1}$</code> ist per Vorraussetzung offen. Der Schnitt von beiden ist wegen * offen. Da n beliebig gro&szlig; werden kann, ist auch M offen <code>$\blacksquare$</code></p> <p>Allerdings gilt: <code>$\displaystyle \bigcap_{n=1}^\infty \left (1 - \frac{1}{n}, 2+\frac{1}{n} \right) = [1, 2]$</code>, also ein Gegenbeispiel.</p> <p>Der &quot;Beweis&quot; ist also offensichtlich falsch. Wo ist aber der Fehler? Man hat gezeigt, dass beliebig viele Schnitte von offenen Mengen wieder offen sind. Die Behauptung sagt aber, dass unendlich viele Schnitte offener Mengen wieder offen sind. Es gibt also einen unterschied zwischen &quot;beliebig viel&quot; und &quot;unendlich&quot;.</p> <h2>Weitere &Uuml;bungen</h2> <ul> <li>KIT, GBI: <a href="http://gbi.ira.uka.de/archiv/2008/blatt-uebung2-aufgaben.pdf">Zusatzblatt 2</a>, &Uuml;bungsaufgabe 16 - <a href="http://gbi.ira.uka.de/archiv/2008/blatt-uebung2-aufgaben.pdf">L&ouml;sungen</a></li> <li>KIT, GBI: <a href="http://gbi.ira.uka.de/archiv/2008/blatt-uebung3-aufgaben.pdf">Zusatzblatt 3</a>, &Uuml;bungsaufgabe 26 d) und 38 d) - <a href="http://gbi.ira.uka.de/archiv/2008/blatt-uebung3-loesungen.pdf">L&ouml;sungen</a></li> <li>Otto Forster: &Uuml;bungsbuch zur Analysis I, 5. Auflage, S. 3 - 6. ISBN 978-3-8348-1252-0.</li> </ul> <h2>Quellen</h2> <ul> <li>Otto Forster: Analysis I, 10. Auflage, S. 1 - 11. ISBN 978-3-8348-1251-3. (Sehr zu empfehlen!)</li> <li><a href="http://gbi.ira.uka.de/uebungen/uebung-2.pdf">Folien zur GBI-&Uuml;bung</a> am KIT</li> <li><a href="http://gbi.ira.uka.de/vorlesungen/VL11.01.2012.pdf">Vorlesung vom 11.01.2012</a></li> <li><a href="http://mitschriebwiki.nomeata.de/WS07/Ana1.html">Analysis I Skript</a> (inoffiziell)</li> </ul> Prädikatenlogik: Aussagen formalisieren http://martin-thoma.com/pradikatenlogik-aussagen-formalisieren Sat, 29 Oct 2011 13:12:33 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/pradikatenlogik-aussagen-formalisieren <p>Es ist h&auml;ufig von Vorteil, wenn man Aussagen formalisieren kann. Es ist beispielsweise gar nicht so leicht das exakte Gegenteil einer Aussage zu finden.</p> <h2>Allgemeines zur Pr&auml;dikatenlogik</h2> <p>x sei im folgenden eine Aussage <code>$\neg x$</code>: Die Negation der Aussage x</p> <p><code>$\exists x$</code>: Es existiert mindestens ein x (Quantor) <code>$\forall x$</code>: Alle x (Quantor)</p> <p><code>$\land$</code>: und (eine Verkn&uuml;fung zweier Aussagen) <code>$\lor$</code>: oder (eine Verkn&uuml;fung zweier Aussagen). Im Deutschen wird oder meistens exklusiv, also im Sinne &quot;entweder ... oder ...&quot; verwendet. Dieses oder ist inklusiv, also &quot;entweder ... oder ... oder beides&quot;.</p> <p>Ich habe die Symbole bewusst in diesen Paragraphen angeordnet. Wird die Negation eines Ausdrucks gebildet, werden alle Symbole im Inneren durch das jeweils andere Symbol ersetzt. Beispielsweise wird das logische &quot;und&quot; zu einem &quot;oder&quot;.</p> <p>Ein kleiner Nachtrag: Was macht man, wenn man sagen will, dass eine Aussage A f&uuml;r genau ein Element x einer Menge M gilt? <code>$\exists x \in M: A(x) \land \forall (y \in M, y \neq x): \neg A(y)$</code></p> <h2>Karlsruher und die Verkehrsmittel</h2> <p>Folgendes Beispiel hatte ich in einem Tutorium am KIT: <blockquote>(i) Alle Karlsruher fahren mit dem Rad oder der Stra&szlig;enbahn.</blockquote> Was ist das Gegenteil dieser Aussage? Folgendes w&auml;re denkbar: <ol> <li>Kein Karlsruher f&auml;hrt mit dem Rad oder der Stra&szlig;enbahn.</li> <li>Kein Karlsruher f&auml;hrt mit dem Rad und der Stra&szlig;enbahn.</li> <li>Alle Karlsruher fahren mit dem Rad und der Stra&szlig;enbahn.</li> <li>Alle Karlsruher fahren nicht mit dem Rad und der Stra&szlig;enbahn.</li> <li>Es fahren nicht alle Karlsruher mit dem Rad oder der Stra&szlig;enbahn.</li> <li>Es fahren nicht alle Karlsruher mit dem Rad und der Stra&szlig;enbahn.</li> <li>...</li> </ol> Nun wurde mir beigebracht, dass folgendes eine &quot;saubere&quot; Formalisierung der ersten Aussage ist:</p> <p>Sei K die Menge aller Karlsruher. Sei F Aussageform auf K und definiert durch <code>$F(k) := \text{&quot;k f&amp;auml;hrt mit dem Fahrrad&quot;} (k \in K)$</code> Sei analog S Aussageform auf K mit <code>$S(k) := \text{&quot;k f&amp;auml;hrt mit der Stra&amp;szlig;enbahn&quot;}$</code></p> <p>Dann lautet (i) formalisiert: <code>$\forall k \in K: F(k) \lor S(k)$</code> <small>(sprich: &quot;F&uuml;r alle k in K gilt: F von k oder S von k&quot;)</small></p> <p>Negiert: <code>$\exists k \in K: \neg F(k) \land \neg S(k)$</code> <small>(sprich: &quot;Es existiert mindestens ein k in K f&uuml;r das gilt: Es ist F von k nicht wahr und zugleich S von k nicht wahr.&quot;)</small></p> <p>&Uuml;bersetzt man das in einen sch&ouml;neren deutschen Satz kann man sagen: Mindestens ein Karlsruher f&auml;hrt weder mit dem Rad noch mit der Bahn.</p> <p>Wenn man das nun auf die oben angegebenen L&ouml;sungen bezieht, k&ouml;nnte es Aussage 5 oder 6 sein. Der Sinngem&auml;&szlig; muss es hei&szlig;en: Es fahren nicht alle Karlsruher entweder mit dem Rad, der Stra&szlig;enbahn oder beidem. Ich tendiere stark dazu, Satz 5 zu nehmen. Allerdings bin ich mir nicht sicher, ob mein Sprachgef&uuml;hl mich t&auml;uscht.</p> <h2>W&ouml;chentliches Fernsehprogramm</h2> <p>Noch ein Beispiel aus meinem Tutorium: <blockquote>(ii) Im Fernsehen l&auml;uft jede Woche &quot;Die Simpsons&quot;, &quot;Die Ludolfs&quot; und &quot;Telekolleg&quot;.</blockquote></p> <p>Sei W die Menge aller Wochen. Sei A Aussageform auf W.</p> <p>A(w) := In der Woche w l&auml;uft &quot;Die Simpsons&quot;. <code>$w \in W$</code> B(w) := In der Woche w l&auml;uft &quot;Die Ludolfs&quot;. <code>$w \in W$</code> C(w) := In der Woche w l&auml;uft &quot;Telekolleg&quot;. <code>$w \in W$</code></p> <p>Dann lautet (ii) formalisiert: <code>$\forall w \in W: A(w) \land B(w) \land C(w)$</code></p> <p>Negiert: <code>$\exists w \in W: \neg A(w) \lor \neg B(w) \lor \neg C(w)$</code></p> <h2>Teilbarkeit</h2> <p>Nun mal etwas eigenes:</p> <blockquote>(iii) Jede gerade Zahl ist durch zwei teilbar.</blockquote> <p>Sei M die Menge der geraden Zahlen. Dann lautet (iii) formalisiert: <code>$\forall m \in M: x = \frac{m}{2} \implies x \in \mathbb{N}$</code></p> <h2>Weitere Materialien</h2> <ul> <li><a href="http://lrb.cs.uni-dortmund.de/~tick/Lehre/WS10/Logik/01-introw.pdf">Uni Dortmund</a>: 15 Seiten zum Formalisieren vom Aussagen</li> <li><a href="http://page.math.tu-berlin.de/~schmitt/lina0910/loesungen/loesung01.pdf">TU-Berlin</a> (Aufgabe 4 - " Jeder, der ein gutes Gehor hat, kann richtig singen[...]")</li> </ul> Konstruktion eines deterministischen endlichen Automaten aus einem nicht-deterministischem http://martin-thoma.com/konstruktion-eines-deterministischen-endlichen-automaten-aus-einem-nicht-deterministischem Sat, 29 Oct 2011 08:21:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/konstruktion-eines-deterministischen-endlichen-automaten-aus-einem-nicht-deterministischem <p>Der nicht-deterministische endliche Automat zu dem regul&auml;rem Ausdruck <code>$(a \cup (ab(b)^\text{*}ba))^\text{*}$</code> ist folgender: <code>$Q = \{S, q_1, q_2\}$</code> <code>$\Sigma = \{a, b\}$</code> <code>$\delta = \text{siehe Grafik}$</code> <code>$F = \{S\}$</code> <code>$NEA = \left( Q, \Sigma, \delta, S, F \right)$</code></p> <div style="width: 365px" class="wp-caption aligncenter"><a href="../images/2011/10/myFiniteStateMachine1.png"><img src="../images/2011/10/myFiniteStateMachine1.png" alt="" width="365" height="119" class="size-full wp-image-8141 "/></a><p class="wp-caption-text"></p></div> <p>Will man daraus nun den endlichen Automaten konstruieren, l&auml;uft das im Prinzip &uuml;ber eine Potenzmengenkonstruktion.</p> <p>Zuerst defnieren wir: <code>$\tilde{S} = E(S) = \{S\}$</code></p> <p>Dann erstellen wir folgende Tabelle: <table style="border:1px solid #000;"> <tr> <th style="border:1px solid #000;"><code>$\tilde{S}$</code></th> <th style="border:1px solid #000;">{S}</th> </tr> <tr> <th style="border:1px solid #000;">a</th> <td style="border:1px solid #000;">&nbsp;</td> </tr> <tr> <th style="border:1px solid #000;">b</th> <td style="border:1px solid #000;">&nbsp;</td> </tr> </table></p> <p>Dann &uuml;berpr&uuml;ft man, welche Zust&auml;nde erreicht werden k&ouml;nnen, wenn man vom jedem Zustand in der Startmenge (hier also nur S) a einliest. Das ist in diesem Fall q1 oder S. Also haben wir eine weitere Zustandsmenge {q1, S}. Diese wird als neue Spalte in unsere Tabelle geschrieben: <table style="border:1px solid #000;"> <tr> <th style="border:1px solid #000;"><code>$\tilde{S}$</code></th> <th style="border:1px solid #000;">{S}</th> <th style="border:1px solid #000;">{q1, S}</th> </tr> <tr> <th style="border:1px solid #000;">a</td> <td style="border:1px solid #000;">{q1, S}</td> <td style="border:1px solid #000;">&nbsp;</td> </tr> <tr> <th style="border:1px solid #000;">b</th> <td style="border:1px solid #000;">&nbsp;</td> <td style="border:1px solid #000;">&nbsp;</td> </tr> </table></p> <p>Nun geht man also jede Spalte, von links nach rechts durch. F&uuml;r jede Spalte wird jede Zeile, von oben nach unten, &uuml;berpr&uuml;ft. Mit jeder &Uuml;berpr&uuml;fung kann eine neue Zustandsmenge als Spalte hinzukommen. Die Anzahl der Zeilen ist eine Kopfzeile + die Anzahl der Zeichen im Eingabealphabet.</p> <p>Am Ende schaut die Tablle wie folgt aus: <table style="border:1px solid #000;"> <tr> <th style="border:1px solid #000;"><code>$\tilde{S}$</code></th> <th style="border:1px solid #000;">{S}</th> <th style="border:1px solid #000;">{q1, S}</th> <th style="border:1px solid #000;"><code>$\emptyset$</code></th> <th style="border:1px solid #000;">{q2}</th> <th style="border:1px solid #000;">{q1, q2}</th> </tr> <tr> <th style="border:1px solid #000;">a</td> <td style="border:1px solid #000;">{q1, S}</td> <td style="border:1px solid #000;">{q1, S}</td> <td style="border:1px solid #000;"><code>$\emptyset$</code></td> <td style="border:1px solid #000;"><code>$\emptyset$</code></td> <td style="border:1px solid #000;">{S}</td> </tr> <tr> <th style="border:1px solid #000;">b</th> <td style="border:1px solid #000;"><code>$\emptyset$</code></td> <td style="border:1px solid #000;">{q2}</td> <td style="border:1px solid #000;"><code>$\emptyset$</code></td> <td style="border:1px solid #000;">{q1, q2}</td> <td style="border:1px solid #000;">{q1, q2}</td> </tr> </table></p> <p><code>$\tilde{Q} = \{\{S\}, \{q_1, S\}, \{q_2\}, \{q_1, q_2\}\}$</code> <code>$\tilde{F} = \{\{S\}, \{q_1, S\}\}$</code></p> <p>Die &Uuml;bergangsfunktion wurde mit dieser Tabelle schon hinreichend dargestellt. Nun folgt eine Darstellung der deterministischen Variante des nichtdeterministischen Automaten:</p> <div style="width: 512px" class="wp-caption aligncenter"><a href="../images/2011/10/deterministic-fsm.png"><img src="../images/2011/10/deterministic-fsm.png" alt="" width="512" height="196" class="size-full wp-image-8421"/></a><p class="wp-caption-text"></p></div> <h2>Material</h2> <p>Die .gv sieht so aus:</p> <div class="highlight"><pre><code class="text">digraph finite_state_machine { rankdir=LR; size=&quot;8,5&quot; node [shape = doublecircle, label=&quot;{S}&quot;] S; node [shape = doublecircle, label=&quot;{q1, S}&quot;] q1S; node [shape = circle, label=&quot;{q2}&quot;] q2; node [shape = circle, label=&quot;{q1, q2}&quot;] q1q2; node [shape = circle, label=&quot;{}&quot;] T; node [shape = point ]; qi qi -&gt; S; S -&gt; q1S [ label = &quot;a&quot; ]; S -&gt; T [ label = &quot;b&quot; ]; q1S -&gt; q1S [ label = &quot;a&quot;]; q1S -&gt; q2 [ label = &quot;b&quot;]; q2 -&gt; T [ label = &quot;a&quot;]; q2 -&gt; q1q2 [ label = &quot;b&quot;]; q1q2 -&gt; S [ label = &quot;a&quot;]; q1q2 -&gt; q1q2 [ label = &quot;b&quot;]; T -&gt; T [label = &quot;a, b&quot;]; } </code></pre></div> <p>Unter Linux kann man mit <a href="http://wiki.ubuntuusers.de/Graphviz">GraphViz</a> mit folgendem Befehl die Datei erstellen:</p> <div class="highlight"><pre><code class="bash">dot -Tpng graph.gv -o deterministic-fsm.png </code></pre></div> How to draw a finite-state machine http://martin-thoma.com/how-to-draw-a-finite-state-machine Sat, 29 Oct 2011 07:37:50 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/how-to-draw-a-finite-state-machine <p><a href="http://en.wikipedia.org/wiki/Deterministic_finite-state_machine">Finite-state machines</a> are necessary to show that some problems are computable (or not).</p> <p>As I am currently learning something about them, I would like to be able to plot those finite automatons automatically. I will use <a href="http://www.graphviz.org/">graphviz</a>. <h2>Nondeterministic finite-state machine</h2> <div style="width: 365px" class="wp-caption aligncenter"><a href="../images/2011/10/myFiniteStateMachine1.png"><img src="../images/2011/10/myFiniteStateMachine1.png" alt="" width="365" height="119" class="size-full wp-image-8141 "/></a><p class="wp-caption-text"></p></div></p> <p>This image is created from a gv-file. I saved it as fsm.gv:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex">digraph finite<span class="nb">_</span>state<span class="nb">_</span>machine <span class="nb">{</span> rankdir=LR; size=&quot;8,5&quot; node [shape = doublecircle]; S; node [shape = point ]; qi node [shape = circle]; qi -&gt; S; S -&gt; q1 [ label = &quot;a&quot; ]; S -&gt; S [ label = &quot;a&quot; ]; q1 -&gt; S [ label = &quot;a&quot; ]; q1 -&gt; q2 [ label = &quot;b&quot; ]; q2 -&gt; q1 [ label = &quot;b&quot; ]; q2 -&gt; q2 [ label = &quot;b&quot; ]; <span class="nb">}</span> </code></pre></div> <p>To create a graph (or the picture of the nondeterministic finite-state machine) you have to enter the following command in Ubuntu Linux:</p> <div class="highlight"><pre><code class="bash language-bash" data-lang="bash">dot -Tpng fsm.gv -o myFiniteStateMachine.png </code></pre></div> <h2>Deterministic finite-state machine</h2> <div style="width: 528px" class="wp-caption alignleft"><a href="../images/2011/10/deterministic-finite-state-machine.png"><img src="../images/2011/10/deterministic-finite-state-machine.png" alt="" width="528" height="248" class="size-full wp-image-8171"/></a><p class="wp-caption-text"></p></div> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex">digraph finite<span class="nb">_</span>state<span class="nb">_</span>machine <span class="nb">{</span> rankdir=LR; size=&quot;8,5&quot; node [shape = doublecircle, label=&quot;<span class="nb">{</span>f<span class="nb">}</span>&quot;, fontsize=12] f; node [shape = doublecircle, label=&quot;<span class="nb">{</span>q2, f<span class="nb">}</span>&quot;, fontsize=10] q2f; node [shape = circle, label=&quot;S&quot;, fontsize=14] S; node [shape = circle, label=&quot;<span class="nb">{</span>q1<span class="nb">}</span>&quot;, fontsize=12] q1; node [shape = circle, label=&quot;<span class="nb">{</span>q2<span class="nb">}</span>&quot;, fontsize=12] q2; node [shape = point ]; qi qi -&gt; S; S -&gt; q1 [ label = &quot;a&quot; ]; S -&gt; q2f [ label = &quot;b&quot; ]; S -&gt; q2 [ label = &quot;c&quot; ]; q1 -&gt; q2 [ label = &quot;b&quot; ]; q2f -&gt; f [ label = &quot;b&quot; ]; q2f -&gt; q2 [ label = &quot;c&quot; ]; q2 -&gt; f [ label = &quot;b&quot; ]; q2 -&gt; q2 [ label = &quot;c&quot; ]; <span class="nb">}</span> </code></pre></div> <h2>LaTeX</h2> <p>If you want to draw finite-state machines with LaTeX, you might want to give <a href="http://www.texample.net/tikz/examples/feature/automata-and-petri-nets/">tikz</a> a try.</p> <p>This is the most minimalistic version I could create. It is equivalent to the nondeterministic finite-state machine I&#39;ve described above: ```latex \documentclass{scrartcl} \usepackage{tikz} \usetikzlibrary{arrows,automata}</p> <p>\begin{document} \begin{tikzpicture}[&gt;=stealth&#39;,shorten &gt;=1pt,auto,node distance=2cm] \node<a href="S">initial,state,accepting</a> {<code>$S$</code>}; \node<a href="q1">state</a> [right of=S] {<code>$q_1$</code>}; \node<a href="q2">state</a> [right of=q1] {<code>$q_2$</code>};</p> <p>\path<a href="S">-&gt;</a> edge [loop above] node {a} (S) edge node {a} (q1) (q1) edge [bend left] node {a} (S) edge node {b} (q2) (q2) edge [loop above] node {b} (q2) edge [bend left] node {b} (q1); \end{tikzpicture} \end{document} ```</p> <p>This was the most basic example which shows how to draw a finite-state automaton with LaTeX. You can get it as a PDF with this command: <code>bash pdflatex latexsheet.tex -output-format=pdf </code></p> <p>If you want to see some more fancy stuff, take a look at this example of a non-deterministic finite state machine: <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/latex-finite-state-machine.png"><img src="../images/2011/10/latex-finite-state-machine.png" alt="" width="400" height="147" class="size-full wp-image-13421"/></a><p class="wp-caption-text"></p></div> ```latex \documentclass{scrartcl} \usepackage{tikz} \usetikzlibrary{arrows,automata}</p> <p>\begin{document} \begin{tikzpicture}[&gt;=stealth&#39;,shorten &gt;=1pt,auto,node distance=2cm] \node<a href="S">initial,state,accepting</a> {<code>$S$</code>}; \node<a href="q1">state</a> [right of=S] {<code>$q_1$</code>}; \node<a href="q2">state</a> [right of=q1] {<code>$q_2$</code>};</p> <p>\path<a href="S">-&gt;</a> edge [loop above] node {a} (S); \path<a href="S">-&gt;, dashed</a> edge node {a} (q1); \path<a href="q1">-&gt;, dotted</a> edge [bend left] node {a} (S); \path<a href="q1">-&gt;&gt;, dotted</a> edge node {b} (q2); \path (q2) edge [loop above] node {b} (q2) edge [bend left] node {b} (q1); \end{tikzpicture} \end{document} ```</p> <h3>Markov models</h3> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="nb">{</span>scrartcl<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>tikz<span class="nb">}</span> <span class="k">\usetikzlibrary</span><span class="nb">{</span>arrows,automata<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>tikzpicture<span class="nb">}</span>[-&gt;,&gt;=stealth&#39;,shorten &gt;=1pt,node distance=2.8cm] <span class="c">% When you want to use // inside of nodes, you have to algin</span> <span class="k">\tikzstyle</span><span class="nb">{</span>every state<span class="nb">}</span>=[align=center] <span class="k">\node</span><span class="na">[state,initial,label=below:Start]</span> (Start) <span class="nb">{</span>A 0.6<span class="k">\\</span>B 0.2<span class="k">\\</span>C 0.2<span class="nb">}</span>; <span class="k">\node</span><span class="na">[state,label=below:Mitte]</span> (Mitte) [right of=Start] <span class="nb">{</span>A 0.1<span class="k">\\</span>B 0.1<span class="k">\\</span>C 0.8<span class="nb">}</span>; <span class="k">\node</span><span class="na">[state,label=below:Ende]</span> (Ende) [right of=Mitte] <span class="nb">{</span>A 0.5<span class="k">\\</span>B 0.2<span class="k">\\</span>C 0.3<span class="nb">}</span>; <span class="k">\path</span> (Start) edge node[above] <span class="nb">{</span>0.2<span class="nb">}</span> (Mitte); <span class="k">\path</span> (Mitte) edge node[above] <span class="nb">{</span>0.8<span class="nb">}</span> (Ende); <span class="k">\path</span> (Start) edge [loop above] node <span class="nb">{</span>0.8<span class="nb">}</span> (Start); <span class="k">\path</span> (Mitte) edge [loop above] node <span class="nb">{</span>0.2<span class="nb">}</span> (Mitte); <span class="k">\path</span> (Ende) edge [loop above] node <span class="nb">{</span>1<span class="nb">}</span> (Ende); <span class="k">\end</span><span class="nb">{</span>tikzpicture<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <h2>Further Reading</h2> <ul> <li><a href="http://www.graphviz.org/doc/info/shapes.html">DOT Node Shape reference</a></li> <li><a href="http://wiki.ubuntuusers.de/Graphviz">ubuntuusers.de</a> (German): Installation on Ubuntu</li> <li><a href="http://www.wikischool.de/wiki/WikiSchool:Graphviz">Wikischool.de</a> (German): Many examples</li> </ul> DVD menu in YouTube http://martin-thoma.com/dvd-menu-in-youtube Fri, 28 Oct 2011 17:25:46 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/dvd-menu-in-youtube <p>Today a friend of mine <a href="http://www.rene-pickhardt.de/first-youtube-dvd-online-for-ballads-n-bullets-by-in-legend/">posted</a> an article about a very neat idea. He created a DVD-like menu with several YouTube clips.</p> <p>Just take a look: <iframe width="560" height="315" src="http://www.youtube.com/embed/lSZNskw1AVw?rel=0" frameborder="0" allowfullscreen></iframe></p> <p>This idea is beatiful: It is simple, but it didn&#39;t come to my mind before. I knew overlays and saw them sometimes, but I never saw them being used in such a nice way.</p> <p>Great work, Ren&eacute;!</p> Einführung in die abzählende Kombinatorik http://martin-thoma.com/einfuhrung-in-die-abzahlende-kombinatorik Mon, 24 Oct 2011 18:53:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/einfuhrung-in-die-abzahlende-kombinatorik <p>Die abz&auml;hlende Kombinatorik besch&auml;ftigt sich mit der Bestimmung der Anzahl m&ouml;glicher Anordnungen oder Auswahlen.</p> <h2>Begriffe</h2> <h3>Permutation</h3> <p>Eine Permutation ist eine Ver&auml;nderung der Reihenfolge einer geordneten Anzahl von Objekten. <small>(Weil die Objekte in irgend einer Art geordnet sein m&uuml;ssen, damit sich eine Reihenfolge &auml;ndern kann, will ich diese Ansammlung nicht &quot;Menge&quot; nennen.)</small></p> <p>Beispiel: Wir haben eine Liste von Zahlen: [1, 2, 5, -7, -1, 3] Eine Permutation davon ist: [1, 2, 5, -7, 3, -1]</p> <p>Anagramme sind Permutationen: &quot;ANGSTBUDE&quot; und &quot;BUNDESTAG&quot;</p> <p>Das Wesentliche ist also, dass es bei Permutationen auf die Reihenfolge ankommt.</p> <h3>k-Permutation</h3> <p>Eine k-Permutation w&auml;hlt aus n Objekten k aus. </p> <p>Wenn wir also die 6 Objekte [1, 2, 5, -7, -1, 3] haben, w&auml;ren [1, 2, 5], [5, 2, 1], [-7, 2, 3] und [-7, 3, 3] verschiedene 3-Permutationen davon.</p> <h3>Kombination und k-Kombination</h3> <p>Bei einer Kombination kommt es <em>nicht</em> auf die Reihenfolge an. Sonst ist alles analog zu den Permutationen.</p> <h2>Formeln</h2> <p>Es gibt nur vier Formeln, die man sich merken sollte. Dabei sei n die Anzahl aller w&auml;hlbaren Objekte:</p> <table> <tr><th>&nbsp;</th><th>mit Wiederholungen</th><th>ohne Wiederholungen</th></tr> <tr><th>k-Permutation</th><td>`$n^k$`</td><td>`$\frac{n!}{(n-k)!}$`</td></tr> <tr><th>k-Kombination</th><td>`$\binom{n-1+k}{k}$`</td><td>`$\binom{n}{k}$`</td></tr> </table> <p>Warum stimmt das?</p> <p>Wenn man n Objekte hat und k-mal eines davon ausw&auml;hlt, wobei die Reihenfolge eine Rolle spielt und man das Objekt danach immer wieder zur&uuml;ck legt (also Wiederholungen haben kann), dann hat man beim ersten mal n verschiedene Wahlm&ouml;glichkeiten. Beim zweiten, dritten, ... k.-Zug auch. Es sind also <code>$\underbrace{n \cdot n \cdot ... \cdot n}_\text{k mal} = n^k$</code> M&ouml;glichkeiten.</p> <p>Wenn man die Objekte nicht wieder zur&uuml;ck legt, die Reihenfolge aber eine Rolle spielt, hat man beim ersten Zug wieder n M&ouml;glichkeiten. Beim zweiten Zug sind es (n-1), beim dritten (n-3), ... beim k.-Zug (n-k+1) M&ouml;glichkeiten. Also gilt: <code>$\underbrace{(n-0) \cdot (n-1) \cdot ... \cdot (n- (k-1))}_\text{k Faktoren} = \prod_{i=0}^{k-1} (n-i)= \frac{n!}{(n-k)!}$</code></p> <p>Angenommen es spielt nun nur eine Rolle, welche Objekte man ausgew&auml;hlt hat, aber nicht wann. Dann gibt es, wenn man die Objekte nicht wieder zur&uuml;cklegt, <code>$\frac{n!}{(n-k)!}$</code> M&ouml;glichkeiten, abz&uuml;glich der M&ouml;glichkeiten, die nur bei Beachtung der Reihenfolge eine Rolle spielen. Das bedeutet, es muss noch durch k! geteilt werden. Das kann man sich klar machen, indem man eine bestimmte Menge an k ausgew&auml;hlten Objekten betrachtet. Dann muss man entscheiden, welches das erste ist. Daf&uuml;r gibt es k M&ouml;glichkeiten. F&uuml;r das zweite hat man (k-1) M&ouml;glichkeiten, usw. Das Bedeutet, es gibt f&uuml;r diesen Fall <code>$\frac{n!}{(n-k)! \cdot k!} = \binom{n}{k}$</code> M&ouml;glichkeiten.</p> <p>Der schwerste Fall sind k-Kombinationen mit zur&uuml;cklegen. Daf&uuml;r denkt man sich am besten, dass man eine Liste der Objekte hat. Nun macht man, um die n Objekte zu trennen, zwischen diese (n-1) Sternchen. Die Anzahl wird durch k Striche repr&auml;sentiert. Nun kann man sich fragen, wie viele M&ouml;glichkeiten es gibt diese k Striche und (n-1) Sternchen anzuordnen. Das sind, wenn man die k Striche auf (n-1)+k Pl&auml;tze verteilt: <code>$\frac{(n-1+k)!}{(n-1)!} \cdot \underbrace{\frac{1}{k!}}_\text{Reihenfolge ist egal} = \frac{(n-1+k)!}{(n-1)!k!}$</code></p> <p>Dies entspricht genau dem Binomialkoeffizienten: <code>$\binom{n-1+k}{k} = \frac{(n-1+k)!}{k!((n-1+k)-k)!} = \frac{(n-1+k)!}{k!(n-1)!}$</code></p> <h2>Siehe auch</h2> <p>Wikipedia: <ul> <li><a href="http://de.wikipedia.org/wiki/Kombinatorik">Kombinatorik</a> (Der Artikel ist leider sehr mager. Eventuell hat jemand lust ihn zu erg&auml;nzen?)</li> <li><a href="http://de.wikipedia.org/wiki/Abz%C3%A4hlende_Kombinatorik">Abz&auml;hlende Kombinatorik</a></li> <li><a href="http://de.wikipedia.org/wiki/Permutation">Permutation</a></li> <li><a href="http://de.wikipedia.org/wiki/Anagramm">Anagramm</a></li> <li><a href="http://de.wikipedia.org/wiki/Binomialkoeffizient">Binomialkoeffizient</a></li> </ul></p> Clip: Love Tap http://martin-thoma.com/clip-love-tap Sun, 23 Oct 2011 14:27:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/clip-love-tap <iframe src="http://player.vimeo.com/video/18486821?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe> <p>A five-minute reminder to not let love pass you by. Developed as original content for Walt Disney Pictures Short Films division.</p> Wie führe ich einen sauberen Beweis? http://martin-thoma.com/wie-fuhre-ich-einen-sauberen-beweis Sun, 23 Oct 2011 11:07:29 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/wie-fuhre-ich-einen-sauberen-beweis <p>In der Mathematik spielen Beweise eine zentrale Rolle. Es gibt verschiedene Beweisarten, aber im folgenden will ich nur einen direkten Beweis f&uuml;hren. Dieses Beispiel wurde in der &Uuml;bung zu Analysis I von Herrn Bolleyer gemacht.</p> <h2>Gliederung</h2> <p>Beweise kann man in drei Teile gliedern:</p> <p><strong>Voraussetzungen</strong>: Hier werden spezielle Objekte, die im Beweis ben&ouml;tigt werden, definiert.</p> <p><strong>Behauptung</strong>: Die Behauptung stellt eine Aussage &uuml;ber die Objekte in der Voraussetzung auf. Sie kann sehr kurz sein.</p> <p><strong>Beweis</strong>: Der Beweis zeigt durch eine folge von logischen Schlussfolgerungen aus den Voraussetzungen, dass die Behauptung wahr ist.</p> <p>N&ouml;tig ist manchmal nur die Behauptung und der Beweis. Mit der Vorraussetzung ist der Beweis zwar vollst&auml;ndig, allerdings w&uuml;rde ich vor dem eigentlichem Beweis eine <strong>Beweisidee</strong> begr&uuml;&szlig;en. Die Beweisidee kann sehr kurz sein. Das ist der eine Satz, der einem Studenten, der sich mit der Aussage besch&auml;ftigt hat, sagt wie sie zu l&ouml;sen ist.</p> <h2>Beispiel eines direkten Beweises</h2> <p><strong>Voraussetzung</strong>: Sei <code>$M = \{ x \in \mathbb{R}: |x-3| \lt 2 \}$</code></p> <p><strong>Behauptung</strong>: <code>$M = (1,5)$</code></p> <p><strong>Beweis</strong>: Per Definition gilt: <code>$|x-3| : = \left \{ \begin{array}{ll} x &amp; \text{, falls } x \geq 3 \\ -(x-3) &amp; \text{, falls } x \lt 3 \end{array} \right.$</code></p> <p><code>$ M = \{x \in \mathbb{R} \lt 2 \} = \underbrace{\{x \in \mathbb{R} : |x-3| \lt 2 \land x \geq 3 \}}_{M_1} \cup \underbrace{\{x \in \mathbb{R}: |x -3| \lt 2 \land x \lt 3\}}_{M_2}$</code></p> <p>Betrachte <code>$M_1$</code>: <code>$ x\in M_1 \Leftrightarrow |x-3| \lt 2 \land x \geq 3$</code> <code>$\Leftrightarrow x-3 \lt 2 \land x \geq 3$</code> <code>$\Leftrightarrow x \lt 5 \land x \geq 3$</code> <code>$\Leftrightarrow 3 \leq x \lt 5$</code> Also gilt <code>$M_1 = [3, 5)$</code></p> <p>Betrachte <code>$M_2$</code>: <code>$ x\in M_2 \Leftrightarrow |x-3| \lt 2 \land x \lt 3$</code> <code>$\Leftrightarrow -(x-3) \lt 2 \land x \lt 3$</code> <code>$\Leftrightarrow -x + 3 \lt 2 \land x \lt 3$</code> <code>$\Leftrightarrow 1 \lt x \land x \lt 3$</code> <code>$\Leftrightarrow 1 \lt x \lt 3$</code> Also gilt <code>$M_2 = (1,3)$</code></p> <p>Es gilt <code>$M = M_1 \cup M_2 = [3, 5) \cup (1,3) = (1,5)$</code> q.e.d.</p> <h2>Weitere Beweisformen</h2> <p>Der <a href="../wie-fuhre-ich-einen-induktionsbeweis/">Induktionsbeweis</a> ist sehr n&uuml;tzlich, wenn man eine Aussage f&uuml;r Elemente zeigen muss, die einen festen Abstand haben. Also z.B. eine Aussage f&uuml;r die Nat&uuml;rlichen Zahlen oder die ganzen Zahlen.</p> <p>Der <a href="../pumping-lemma/">Widerspruchsbeweis</a> ist gut geeignet, wenn notwendige, aber nicht hinreichende Kriterien f&uuml;r das Gegenteil der Behauptung nicht erf&uuml;llt sind.</p> <h2>Siehe auch</h2> <ul> <li>Wikipedia: <a href="http://de.wikipedia.org/wiki/Beweis_(Mathematik)">Beweis</a></li> <li><a href="http://mitschriebwiki.nomeata.de/WS07/Ana1.pdf">Inoffizielles Script</a></li> </ul> Game: Marble Run http://martin-thoma.com/game-marble-run Sun, 23 Oct 2011 06:41:58 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/game-marble-run <div style="width: 584px" class="wp-caption alignleft"><a href="../images/2011/10/marblerun.png"><img src="../images/2011/10/marblerun.png" alt="" width="584" height="558" class="size-full wp-image-7181"/></a><p class="wp-caption-text"></p></div> <p><b>Go to the Game</b>: <a href="http://marblerun.at/tracks/new" rel="nofollow">marblerun.at</a> <b>Task</b>: Create a Track for that little red dot, which is as long as possible. <b>How to play</b>: On the right side of the screen you can see a toolbar. Different bricks, some with special functions, can be used to build your track. <b>My Record</b>: 37m <b>Programming</b>: The entire page is written in HTML + JavaScript. They used the Prototype JS library.</p> Understanding Python Lists http://martin-thoma.com/understanding-python-lists Sat, 22 Oct 2011 21:01:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/understanding-python-lists <p>This article is about Python lists. I just want to show you some examples of the unexpected behaviour (for non-python-programmers) of lists in Python.</p> <p>Imagine you have the following Python source code:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">copy</span> <span class="n">example1</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">7</span><span class="p">],[</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">],[],</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">6</span><span class="p">]]</span> <span class="n">example2</span> <span class="o">=</span> <span class="n">example1</span><span class="p">[:]</span> <span class="n">example3</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">example1</span><span class="p">)</span> <span class="n">example4</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">example1</span><span class="p">)</span> <span class="n">example1</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">example1</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">print</span> <span class="n">example1</span> <span class="k">print</span> <span class="n">example2</span> <span class="k">print</span> <span class="n">example3</span> <span class="k">print</span> <span class="n">example4</span> </code></pre></div> <p>How should the output look like? Think about it a second, then scroll down.</p> <div class="highlight"><pre><code class="bash"><span class="o">[[</span>1,5,7<span class="o">]</span>,<span class="o">[</span>0,6<span class="o">]</span>,<span class="o">[]</span>,<span class="o">[</span>8,1,6<span class="o">]</span>,1<span class="o">]</span> <span class="o">[[</span>1,5,7<span class="o">]</span>,<span class="o">[</span>0,6<span class="o">]</span>,<span class="o">[]</span>,<span class="o">[</span>8,1,6<span class="o">]]</span> <span class="o">[[</span>1,5,7<span class="o">]</span>,<span class="o">[</span>0,6<span class="o">]</span>,<span class="o">[]</span>,<span class="o">[</span>8,1,6<span class="o">]]</span> <span class="o">[[</span>1,5,7<span class="o">]</span>,<span class="o">[</span>3,6<span class="o">]</span>,<span class="o">[]</span>,<span class="o">[</span>8,1,6<span class="o">]]</span> </code></pre></div> <p>The reason for this strange behaviour is how lists are handled in Python. The variable itself is basically only the pointer to the list. If you slice the list (myList[:]) you copy each value of the list into another list. If myList was a nested list, it contained the pointers to the sublists. So, if you want to make a deep copy, you have to use the copy module.</p> <h2>Scoping</h2> <p>phimuemue added this example in my old blog:</p> <p>Another issue I ran into concerns the scoping of Python:</p> <div class="highlight"><pre><code class="python"><span class="n">i</span><span class="o">=</span><span class="mi">0</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]]</span> <span class="k">print</span> <span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="c"># yields 3</span> </code></pre></div> <p>That means, python doesn&#39;t create a new variable for the list comprehension but uses the outer i.</p> <h2>Recursive Lists</h2> <div class="highlight"><pre><code class="python"><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="n">a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]]</span> <span class="n">b</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">[</span><span class="o">...</span><span class="p">]]]</span> <span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="p">[</span><span class="o">...</span><span class="p">]]]</span> </code></pre></div> <p>Do you know more examples of unexpected behaviour of python lists? Please share them in the comments!</p> Improvements for my University's Website http://martin-thoma.com/improvements-for-my-universitys-website Sat, 22 Oct 2011 18:55:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/improvements-for-my-universitys-website <p>I am now studying at the <a href="http://en.wikipedia.org/wiki/Karlsruhe_Institute_of_Technology">Karlsruhe Institute of Technology</a> (KIT). Although I think that the Websites of KIT is much better than the Website of most Universities, I can imagine several possibilities how the online services could be improved:</p> <h2>Use OpenID</h2> <p>I have 9 different accounts with 7 different passwords for university. After my first week.</p> <p>I guess it is impossible to use the same login system for all services of the university as we have many different teams of developers. But it is easily possible to get an OpenID provider. The students could have an URL like student.kit.edu/openid/u.... or something similar. The login would always happen at one place and this server could tell the other services that the right user is trying to get access. </p> <p>Some more information about OpenID is here: <ul> <li><a href="http://en.wikipedia.org/wiki/OpenID">Wikipedia</a> (the <a href="http://de.wikipedia.org/wiki/OpenID">German article</a> is much better)</li> <li><a href="http://www.youtube.com/watch?v=xcmY8Pk-qEk">OpenID According to Dave</a> (4:35 min)</li> <li><a href="http://www.youtube.com/watch?v=DslTkwON1Bk">The Implications of OpenID</a> (51:19 min)</li> </ul></p> <h2>Customization</h2> <p>It would help me a lot if I could customize my start page at studium.kit.edu by adding some links / text.</p> <h2>Consistency</h2> <p>The university was called &quot;University of Karlsruhe&quot; (&quot;Universit&auml;t Karlsruhe&quot; in German) a few years ago. Then they thought it was time to rename the university as they made major structural changes.</p> <h3>URLs - one Top-level domain</h3> <p>They also got a new URL. Before the new one is kit.edu, but it seems as if many pages were still on the old <abbr title="top-level domain">TLD</abbr>: <ul> <li>uni-karlsruhe.de: <ul> <li><a href="http://www.fsmi.uni-karlsruhe.de/">fsmi.uni-karlsruhe.de</a>: fsmi.kit.edu</li> <li><a href="http://www2.mach.uni-karlsruhe.de/srmach/srmach.php">mach.uni-karlsruhe.de</a>: should be mach.kit.edu</li> </ul> <li>http://www.ira.uka.de/: <a href="https://webinscribe.ira.uka.de/">webinscribe.ira.uka.de</a>: should be webinscribe.kit.edu. Additionally, a link from studium.kit.edu to this service should be created.</li> <li><a href="http://www.itas.fzk.de/">www.itas.fzk.de</a>: should be itas.kit.edu. (I guess fzk means &quot;Forschungszentrum Karlsruhe&quot; - research center Karlsruhe)</li> </ul></p> <p>This could be fixed with the following steps: <ul> <li>Find old URLs / Links (e.g. with <bbr title="Regular Expressions">RegEx</abbr> and a <a href="http://en.wikipedia.org/wiki/Web_crawler">crawler</a>)</li> <li>Introduce the new URL by one of those two possibilites: <ul> <li>Make HTML-redirections for the new ones (e.g. from fsmi.kit.edu to www.fsmi.uni-karlsruhe.de)</li> <li>Move the content from the old space to the new space. Make sure that nothing breaks by adding a <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection">301 status code</a>.</li> </ul> <li>Replace all links to the old URL by the new URL.</li> <li>Wait at least one, rather two semester. Check which internal Websites still use the old URL and try to fix those links.</li> <li>Completely remove the old URL</li> </ul></p> <h3>Services in one place</h3> <p>KIT offers quite a lot of online services, such as <ul> <li><a href="http://www.bibliothek.kit.edu/cms/index.php">Search for books</a> in KIT-library <li><a href="https://www.rz.uni-karlsruhe.de/cgi-bin/bvprint">bvprint</a>: How much money is left on my printing-account?</li> <li>Webmail: <ul> <li>u....@student.kit.edu / prename.lastname@student.kit.edu / u....@stud.uni-karlsruhe.de: <a href="https://owa.kit.edu">owa.kit.edu</a> - with Microsofts <a href="http://en.wikipedia.org/wiki/Outlook_Web_App">OWA</a></li> <li>s<em>...@atis.uka.de: <a href="https://webmail.ira.uni-karlsruhe.de/imp/login.php">webmail.ira.uni-karlsruhe.de</a> - with &lt;a href=&quot;http://en.wikipedia.org/wiki/Horde</em>(software)&quot;&gt;Horde Groupware</a></li> </ul> </li> <li><a href="http://www.scc.kit.edu/dienste/3203.php">Web-Server</a> with <a href="http://www.scc.kit.edu/dienste/7881.php">MySQL databases</a> and <a href="https://www.rz.uni-karlsruhe.de/phpmyadmin/?server=5">phpMyAdmin</a></li> <li><a href="http://www.scc.kit.edu/dienste/3203.php">New Sites</a>: Create a site for you</li> </ul></p> <p>For some services you need to login via <a href="https://vpn.kit.edu/">https://vpn.kit.edu</a>: <ul> <li>Print preview: <a href="https://scc-print.scc.kit.edu/cgi-bin/preview/index.cgi?printer=bw600dpi&user=">https://scc-print.scc.kit.edu</a> and the (buggy) <a href="https://scc-print-06.scc.kit.edu/cgi-bin/print/index.cgi">newer version</a>.</li> <li><a href="https://print.rz.uni-karlsruhe.de/cgi-bin/pu">PrintUtil</a>: Which jobs are in the queue of the printer?</li> <li>Scanning: <a href="http://studscan.ira.uka.de/">studscan.ira.uka.de</a></li> </ul></p> <p>I had to search for some services, like a SVN-Repository (<a href="http://www.atis.uka.de/1422.php">How do I get a SVN repository at KIT?</a>)</p> <p>The important services should be available at studium.kit.edu. I think this would be a link to the Webmail, to the printing services and webinscribe.</p> <h2>Help the user to find what he needs</h2> <h3>Redundancy</h3> <p>Sometimes it is good to provide several alternatives. I have one example: One of the most important URLs at my university&#39;s website is studium.kit.edu. In the first week, I typed quite often student.kit.edu. Google corrected kit to mit and the MIT has such a page. I think it would be a good idea to look at the 404-error log and check, if this occurs often. If it does, a redirect should probable be added.</p> <p>All redundant URLs should point to ONE target, of course. It&#39;s best to use a 301 redirection.</p> <h3>Short, but meaningful URLs</h3> <p>At the moment KIT makes use of such URLs: <ul> <li>www.kit.edu/index.php should be kit.edu</li> <li>www.informatik.kit.edu/index.php should be informatik.kit.edu</li> <li><a href="http://www.informatik.kit.edu/883.php">www.informatik.kit.edu/883.php</a> should be informatik.kit.edu/informatik-bachelor</li> <li>www.informatik.kit.edu/interact.php should be informatik.kit.edu/interact</li> </ul></p> <p>This can be done by modifying the .htaccess-file (for the decision to redirect calls prefixed with www to a non-www page).</p> <p>In many cases you can use the URL which I would prefer, but you&#39;re redirected to the other one. This means if a professor is copying the ugly link to his presentation, all students will have to write it down. </p> <h3>Helpfull 404 Page</h3> <p>At the moment I get only: &quot;404 NOT FOUND&quot;. This is not very helpful. You should provide a <a href="../custom-404-error-pages/" title="Custom 404 error pages">custom 404 error page</a>.</p> <h3>Use Feeds</h3> <p>I would like to get the latest news about KIT, but I don&#39;t want to search for it. I also don&#39;t want to look at the homepage of KIT to check if I know the latest content. This should be done with a RSS feed.</p> <p>The start page should have an auto-detectable RSS-Feed. It can be added with the following HTML-Tag in the head-section of the document: <code>html &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;KIT News Feed&quot; href=&quot;/rss/&quot; /&gt; </code></p> <h2>Use HTML5 input tags</h2> <p>HTML5 input tags can much more than the old ones. You can define <a href="http://www.w3schools.com/html5/att_input_autofocus.asp">autofocus</a> for the first element, <a href="http://www.w3schools.com/html5/att_input_placeholder.asp">placeholders</a>, <a href="http://www.w3schools.com/html5/att_input_autocomplete.asp">autocomplete</a>=off for password fields at the registration, <a href="http://www.w3schools.com/html5/att_input_pattern.asp">patterns</a> for clients side validation and <a href="http://www.w3schools.com/html5/att_input_type.asp">much more types</a> than text and password. Old browsers automatically fall back into a simple text input field.</p> <p>Examples for pages that could be improved: <ul> <li><a href="http://kit.edu">kit.edu</a>: Add <a href="../search-engine-autodiscovery/" title="Search Engine Autodiscovery">search engine autodiscovery</a></li> <li><a href="http://i3vloan.ubka.uni-karlsruhe.de/19466917473783462330/i3v_library/ausleihe/i3v_ausleihe.cgi?opacdb=UBKA_OPAC&session=19466917473783462330&Funktion=Ersterfassung&lang=DE">Register library account</a></li> <li><a href="https://studium.kit.edu">studium.kit.edu</a></li> <li><a href="http://www.kit.edu/index.php">kit.edu</a> (the search box)</li> <li><a href="http://www.kit.edu/studieren/6243.php">kit.edu/studieren/6243.php</a> (the contact form at the bottom)</li> <li><a href="http://www.kit.edu/markt/userlogin.php">kit.edu/markt/userlogin</a> (the login form)</li> </ul></p> <p>If somebody had much free time he could try to get valid HTML5 for the whole website. This isn&#39;t really helpful for the user (by now), but it would be nice to have a standard conform website.</p> <h2>Payments</h2> <p>You have to pay with the &quot;KIT-Card&quot; for meals in the cafeteria and if you want to print something. But you have to transfer the money to the printing account from your cafeteria account, before you can print anything. This seems to be not logical for me. Why do we have to use two university &quot;bank&quot; accounts?</p> Custom 404 error pages http://martin-thoma.com/custom-404-error-pages Sat, 22 Oct 2011 18:50:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/custom-404-error-pages <p><a href="../images/2011/10/404-Not-Found.png"><img src="../images/2011/10/404-Not-Found.png" alt="" title="404 Not Found" width="128" height="128" class="alignleft size-full wp-image-7061" /></a> A 404 http status code means that no document could be found at the given URL. The reason could be a misspelled URL or moved content. </p> <p>Anyway, the user needs help now. The standard error page doesn&#39;t provide much information, so you should create a custome one.</p> <p>If you like more information, just google for &quot;custom 404 page&quot;.</p> <h2>How to create a custom 404 error page</h2> <p>Simply add the following line to your .htaccess file:</p> <div class="highlight"><pre><code class="apache language-apache" data-lang="apache"><span class="nb">ErrorDocument</span> <span class="m">404</span> <span class="sx">/notfound.php</span> </code></pre></div> <p>(This will work only on an Apache webserver, of course).</p> <p>Now you have to create a notfound.php file. This file should provide the following information: <ul> <li>Tell the user that he typed a wrong URL or that the link pointed to a target which doesn&#39;t exist</li> <li>Provide a search box</li> <li>Provide a link to a graphical sitemap</li> <li>Provide some funny / interesting content</li> <li>Make sure that a 404 http status code is still returned after your changes</li> </ul></p> <h2>Good examples</h2> <ul> <li><a href="http://www.hongkiat.com/blog/60-really-cool-and-creative-error-404-pages/">60 Really Cool And Creative Error 404 Pages</a></li> <li><a href="http://dzineblog.com/2008/11/custom-error-404-pages.html">36 Cool Custom Error 404 Pages</a></li> <li><a href="http://www.smashingmagazine.com/2007/08/17/404-error-pages-reloaded/">404 Error Pages: Reloaded</a></li> </ul> <h2>Further Reading</h2> <ul> <li><a href="http://www.404errorpages.com/">404 Error Pages .com</a></li> <li><a href="http://en.wikipedia.org/wiki/HTTP_404">Wikipedia</a></li> </ul> Search Engine Autodiscovery http://martin-thoma.com/search-engine-autodiscovery Sat, 22 Oct 2011 09:12:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/search-engine-autodiscovery <p>Recently I read a very good post about search engine autodiscovery <a href="http://www.knallisworld.de/blog/2011/04/14/autodiscovery-der-searchengine-in-google-chrome-opensearch/">by Jan Phillip</a>. Did you know that many browsers can detect an internal search engine automatically? Firefox gives you the possibility to add such a search engine to your browser: <div style="width: 294px" class="wp-caption aligncenter"><a href="../images/2011/10/firefox-add-search-engine.png"><img src="../images/2011/10/firefox-add-search-engine.png" alt="" width="294" height="236" class="size-full wp-image-6921"/></a><p class="wp-caption-text"></p></div></p> <h2>OpenSearch</h2> <p><a href="http://en.wikipedia.org/wiki/OpenSearch">OpenSearch</a> is a collection of technologies. This project aims to create a standard for publishing the metadata which describes a search engine: name, description, URL-pattern, language, ...</p> <p>A <abbr title="OpenSearch Description Document">OSSD</abbr> looks like this: <code>xml &lt;OpenSearchDescription xmlns=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;&gt; &lt;ShortName&gt;Example&lt;/ShortName&gt; &lt;Description&gt;My example search engine&lt;/Description&gt; &lt;InputEncoding&gt;UTF-8&lt;/InputEncoding&gt; &lt;Image height=&quot;16&quot; width=&quot;16&quot; type=&quot;image/x-icon&quot;&gt; http://example.org/favicon.ico &lt;/Image&gt; &lt;Url type=&quot;text/html&quot; template=&quot;http://example.org/index.html#search={searchTerms}&quot;/&gt; &lt;/OpenSearchDescription&gt; </code></p> <p>The browser needs a hint where it can find the OSSD. So you have to add the following tag to your website: <code>xml &lt;link title = &quot;Example&quot; type = &quot;application/opensearchdescription+xml&quot; rel = &quot;search&quot; href = &quot;http://example.org/opensearch.xml&quot;&gt; </code></p> <p>Now you can add the websites internal search engine automatically to Chrome and easily to Firefox and Internet Explorer 8+. </p> <p>Additionally, you can add this little piece of JavaScript to tell Firefox 2+ and Internet Explorer 7+ that your site supports OpenSearch:</p> <div class="highlight"><pre><code class="javascript"><span class="nb">window</span><span class="p">.</span><span class="nx">external</span><span class="p">.</span><span class="nx">AddSearchProvider</span><span class="p">(</span><span class="s2">&quot;http://exampl.org/opensearch.xml&quot;</span><span class="p">);</span> </code></pre></div> <h2>Google Chrome Autodiscovery</h2> <p>Google doesn&#39;t provide a <abbr title="user interface">UI</abbr> for adding an internal search engine. Instead, you can add it via Settings:</p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/google-chrome-add-search-300x206.png"><img src="../images/2011/10/google-chrome-add-search-300x206.png" alt="" width="300" height="206" class="size-medium wp-image-6891"/></a><p class="wp-caption-text"></p></div> <p>Chrome also adds the sites internal search engine automatically. Did you ever notice this? Here are some screenshots:</p> <div style="width: 659px" class="wp-caption aligncenter"><a href="../images/2011/10/google-chrome-search-1.png"><img src="../images/2011/10/google-chrome-search-1.png" alt="" width="659" height="31" class="size-full wp-image-6841"/></a><p class="wp-caption-text"></p></div> <div style="width: 656px" class="wp-caption aligncenter"><a href="../images/2011/10/google-chrome-search-2.png"><img src="../images/2011/10/google-chrome-search-2.png" alt="" width="656" height="30" class="size-full wp-image-6851"/></a><p class="wp-caption-text"></p></div> <p>Interestingly the auto discovery only works if the search engine is at the homepage. You have to have either an input field of the type <code>search</code> or of the type <code>text</code> with the name <code>s</code>:</p> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;form&gt;</span> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;search&quot;</span> <span class="na">name=</span><span class="s">&quot;s&quot;</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/form&gt;</span> </code></pre></div> <p>or</p> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;form&gt;</span> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;s&quot;</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/form&gt;</span> </code></pre></div> <h2>Drawbacks</h2> <ul> <li>It seems as if Safari didn't support OSSD natively. (14.04.2011)</li> <li>Internet Explorer 9 seems not to support OSSD.</li> <li>No support by Opera.</li> </ul> <h2>This article in a nutshell</h2> <ul> <li>opensearch.xml gives meta information about your websites internal search engine</li> <li>For Chromes autodiscovery you will need to add an input fild with "type=search" or "name=s"</li> <li>It is not necessary for Chrome that the user can see the form (display:none with CSS) nor that it the site start page is loaded long (meta redirect after 0 seconds).</li> <li>Adding the search engine manually is possible in almost all browsers</li> <li>With OSSD you can manage more than one internal search engine.</li> </ul> <h2>Further reading</h2> <ul> <li>OpenSearch.org: <ul> <li><a href="http://www.opensearch.org/Community/OpenSearch_search_clients">OpenSearch search clients</a></li> <li><a href="http://www.opensearch.org/Documentation/Developer_best_practices_guide">Developer best practices guide</a></li> </ul> </li> <li>David Walsh: <a href="http://davidwalsh.name/open-search">Add Your Website to Firefox&rsquo;s Search Bar Using OpenSearch XML</a>.</li> </ul> Clip: Bob the Hamster http://martin-thoma.com/bob-the-hamste Sat, 22 Oct 2011 06:35:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/bob-the-hamste <iframe src="http://player.vimeo.com/video/25845008?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe> <p>Bob tells the story of a little hamster that tries to follow his true love around the globe. Can he catch up? We all hope you have fun watching it! Enjoy!</p> WarLight: An online Risk clone http://martin-thoma.com/warlight-an-online-risk-clone Fri, 21 Oct 2011 04:36:09 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/warlight-an-online-risk-clone <p><a href="http://en.wikipedia.org/wiki/Risk_(game)">Risk</a> is a great strategic game in which you have to conquer the world.</p> <p>Now I&#39;ve found a clone called &quot;Warlight&quot;: <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/Warlight-300x206.png"><img src="../images/2011/10/Warlight-300x206.png" alt="" width="300" height="206" class="size-medium wp-image-6511"/></a><p class="wp-caption-text"></p></div></p> <p><strong>Go to the Game</strong>: <a href="http://www.kongregate.com/games/FizzerWL/warlight">WarLight</a> on Kongregate <strong>Task</strong>: Conquer the world. <strong>How to play</strong>: Each turn you get armies depending on the number of countries / territories you controll. <strong>My Record</strong>: I could solve Level 1 - 3 and Europe.</p> Community Chess http://martin-thoma.com/community-chess Wed, 19 Oct 2011 10:30:01 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/community-chess <p>Community Chess is one of my projects. I can make something usefull and play a bit. This project has now an own URL: <a href="http://community-chess.com/">community-chess.com</a></p> <p>It&#39;s a little bit crappy at the moment as I&#39;ve just started studying, but I&#39;ll fix that.</p> <p>If you like to help, please write me an Email (info@martin-thoma.de). Everybody can help. Here are some examples:</p> <p>I need some people who <ul> <li>can create a better desing / color scheme</li> <li>use it and know chess rules</li> <li>know how to customize phpBB</li> <li>know how to write Ajax for a better GUI (playChess.php works with PHP and HTML at the moment)</li> <li>can speak other languages than English and German</li> <li>know how to advertise</li> <li>like to support this project with money (I have to pay 26.16 Euro per year for hosting this service. If I get more money I will save it for the next years hosting costs. If it&#39;s much more I could try to find a professional designer.)</li> </ul></p> Analysis I - Teil 1 http://martin-thoma.com/analysis-i-teil-1 Tue, 18 Oct 2011 15:50:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/analysis-i-teil-1 <h2>Begriffe und Bezeichnungen</h2> <h3>Mengen</h3> <p>Es seien M und N Mengen.</p> <p><code>$M \cup N$</code>: Vereinigung - Die Elemente sind in M oder N <code>$M \cap N$</code>: Durchschnitt (&quot;Schnittmenge&quot;) - Die Elemente sind in M und N <code>$M \setminus N$</code>: Differenzmenge - Die Elemente sind in M aber nicht in N <code>$M \subseteq N$</code>: Teilmenge - Alle Elemente in M sind auch in N <code>$\emptyset$</code>: Leere Menge <code>$a \in M$</code>: a ist ein Element von M <code>$a \notin M$</code>: a ist kein Element von M</p> <h3>Funktionen</h3> <p>Seien M, N Mengen mit <code>$M \neq \emptyset \neq N$</code>. <code>$f: \underbrace{M}_{\mathbb{D}} \to \underbrace{N}_{\mathbb{W}}$</code></p> <h3>Logische Zeichen</h3> <p><code>$\Rightarrow$</code>: Implikation, z.B. <code>$A \Rightarrow B$</code>: Aus A folgt B <code>$\Leftrightarrow$</code>: &Auml;quivalenz. <code>$A \Rightarrow B \wedge B \Rightarrow A$</code>: Aus A folgt B und umgekehrt. <code>$\underbrace{: \Leftrightarrow}_\text{&quot;genau dann&quot;}$</code>, z.B. <code>$M \subseteq N : \Leftrightarrow \text{aus } x \in M \text{ folgt stets } x \in N$</code>. <code>$\forall$</code>: <a href="http://de.wikipedia.org/wiki/Existenzquantor#Existenz-_und_Allquantor">Allquantor</a>, sprich &quot;f&uuml;r alle&quot; oder &quot;f&uuml;r jedes&quot; <code>$\exists$</code>: <a href="http://de.wikipedia.org/wiki/Existenzquantor#Existenz-_und_Allquantor">Existenzquantor</a>, sprich &quot;es gibt mindestens ein&quot; oder &quot;es existiert&quot;</p> <h2>Reele Zahlen</h2> <p>Die Grundmenge der Analysis ist die Menge <code>$\mathbb{R}$</code>, die Menge der reelen Zahlen. Diese f&uuml;hren wir durch die folgenden 15 Axiome ein.</p> <h3>K&ouml;rperaxiome</h3> <p>In <code>$\mathbb{R}$</code> seien zwei Verkn&uuml;pfungen &quot;+&quot; und &quot;&middot;&quot; gegeben. Sie ordnen jedem Paar <code>$a, b \in \mathbb{R}$</code> genau ein <code>$ab := a \cdot b \in \mathbb{R}$</code> zu. Dabei soll gelten:</p> <p><code>$\left. \begin{array}{lllll} A.1 &amp; a+ (b+c) &amp; = &amp; (a+b)+c &amp; \forall a, b, c \in \mathbb{R} \\ A.2 &amp; a \cdot (bc) &amp; = &amp; (ab) \cdot c &amp; \forall a, b, c \in \mathbb{R} \\ \end{array} \right \} \text{Assoziativgesetze}$</code></p> <p><code>$\left. \begin{array}{lllll} A.3 &amp; a + b &amp; = &amp; b + a &amp; \forall a, b \in \mathbb{R} \\ A.4 &amp; a \cdot b &amp; = &amp; b) \cdot a &amp; \forall a, b \in \mathbb{R} \\ \end{array} \right \} \text{Kommutativgesetze}$</code></p> <p><code>$\left. \begin{array}{lllll} A.5 &amp; \exists 0 \in \mathbb{R} &amp; : &amp; a + 0 = a &amp; \forall a \in \mathbb{R} \text{ (&quot;Null&quot;)} \\ A.6 &amp; \exists 1 \in \mathbb{R} &amp; : &amp; a \cdot 1 = a \wedge 1 \neq 0 &amp; \forall a \in \mathbb{R} \text{ (&quot;Eins&quot;)} \\ \end{array} \right \} \text{Neutrales Element}$</code></p> <p><code>$\left. \begin{array}{lllll} A.7 &amp; \forall a \in \mathbb{R} \exists -a \in \mathbb{R} &amp; : &amp; a + (-a) = 0 \\ A.8 &amp; \forall a \in \mathbb{R} \setminus {0} \exists -a^{-1} \in \mathbb{R} &amp; : &amp; a \cdot a^{-1} = 1 \end{array} \right \} \text{Inverses Element}$</code></p> <p><code>$\text{A.9 } a(b+c) = ab+ac \forall a, b, c \in \mathbb{R}$</code>: Distributivgesetz</p> <p>Schreibweisen: f&uuml;r <code>$a, b \in \mathbb{R}: a -b := a + (-b)$</code> f&uuml;r <code>$b \neq 0: \frac{a}{b} := a \cdot b^{-1}$</code></p> <p>Alle Rechenregeln bzgl der Grundrechenarten lassen sich aus A.1 - A.9 herleiten. Diese Regeln seien von nun an bekannt.</p> <p><strong>Behauptung</strong>: Es existiert genau ein <code>$0 \in \mathbb{R}: a+0 = a \forall a \in \mathbb{R}$</code> <strong>Beweis</strong>: Existenz: folgt aus A.5 Eindeutigkeit: Sei <code>$\tilde 0 \in \mathbb{R} \text{ mit }a+\tilde 0 a \forall a \in \mathbb{R}$</code> Mit <code>$a = 0: 0 = 0 + \tilde 0 \underbrace{=}_{\text{A.3}} \tilde 0 + 0 \underbrace{=}_{\text{A.5}} = \tilde 0$</code></p> <p><strong>Behauptung</strong>: Ist <code>$a \in \mathbb{R}\text{, so ist }a \cdot 0 = 0$</code> <strong>Beweis</strong>: <code>$ b := a \cdot 0 \underbrace{\Rightarrow}_\text{A.5} b = a (0 + 0) \Rightarrow a \cdot 0 + a \cdot 0 = b + b$</code> <code>$0 = b + (-b) = (b+b) + (-b) = b + (b + (-b)) = b + 0 = b$</code></p> <h3>Anordnungsaxiome</h3> <p>In <code>$\mathbb{R}$</code> sei eine Relation &quot;<code>$\leq$</code>&quot; gegeben. Dabei soll gelten:</p> <p><code>$ \begin{array}{lll} A.10 &amp; a \leq b \lor b \leq a &amp; \forall a, b \in \mathbb{R} \\ A.11 &amp; a \leq b \land b \leq a &amp; \rightarrow a = b \\ A.12 &amp; a \leq b \land b \leq c &amp; \rightarrow a \leq c \\ A.13 &amp; a \leq b \rightarrow a + c \leq b + c &amp; \forall c \in \mathbb{R} \\ A.14 &amp; a \leq b \land 0 \leq c \Rightarrow a \leq c \end{array} $</code></p> <p>Schreibweise: <code>$a \geq b: \Leftrightarrow b \geq a$</code> <code>$a \lt b: \Leftrightarrow a \leq b \land a \neq b$</code> <code>$a \gt b: \Leftrightarrow b \lt a$</code></p> <p>Alle Regeln f&uuml;r Ungleichungen lassen sich aus A.1 - A.14 herleiten. Diese Regeln seien nun bekannt.</p> <p><strong>Definition</strong>: F&uuml;r <code>$a \in \mathbb{R}$</code> sei <code>$|a| : = \left \{ \begin{array}{ll} a &amp; \text{, falls } a \geq 0 \\ -a &amp; \text{, falls } a \lt 0 \end{array} \right.$</code></p> <p>Anschaulich: Der Betrag misst den absoluten Abstand zur 0 auf dem Zahlenstrahl.</p> <p><code>$|a-b| \mathrel{\widehat{=}} \text{Abstand von a und b}$</code></p> <p><strong>Satz</strong>: Seien <code>$a, b \in \mathbb{R}$</code>. Dann: <ul> <li><code>$|a| \geq 0$</code></li> <li><code>$|ab| = |a| \cdot |b|$</code></li> <li><code>$\pm a \leq |a|$</code></li> <li><code>$|a+b| \leq |a| + |b|$</code>: Dreiecksungleichung</li> <li><code>$| |a| - |b| | \leq | a-b|$</code></li> </ul></p> <p><strong>Beweis</strong>: 1, 2, 3 leichte &Uuml;bung <strong>Beweis von 4.</strong>: Fall 1: <code>$a+b \geq 0$</code>. Dann <code>$|a+b| = a + b \leq |a| + |b|$</code> Fall 2: <code>$a+b \lt 0$</code>. Dann <code>$|a+b| = -(a+b) = (-a) + (-b) \leq |a| + |b|$</code> <strong>Beweis von 5.</strong>: <code>$c := |a| - |b|$</code>. Es ist <code>$|a| = |a - b + b| \leq |a - b | + |b| \Rightarrow |a| - |b| \leq |a - b|$</code>, also <code>$c \leq |a - b|$</code></p> <p>Analog: <code>$ -c = |b| - |a| \leq |b-a| = |a - b|$</code>. Es ist <code>$| |a| - |b| | = c \text{ oder } = -c$</code>.</p> <h3>Intervalle</h3> <p>Seien <code>$a, b \in \mathbb{R} \land a \lt b$</code>.</p> <p><code>$(a,b) := \{x \in \mathbb{R} a \lt x \lt b\}$</code>: offenes Intervall <code>$[a,b] := \{x \in \mathbb{R} a \leq x \leq b\}$</code>: geschlossenes Intervall <code>$(a,b] := \{x \in \mathbb{R} a \lt x \leq b\}$</code>: halboffenes Intervall <code>$[a,\infty) := \{x \in \mathbb{R} a \leq x \}$</code>. <code>$(a,\infty) := \{x \in \mathbb{R} a \lt x \}$</code>. <code>$(-\infty,a]:= \{x \in \mathbb{R} x \leq a \}$</code>. <code>$(-\infty,\infty):= \mathbb{R}$</code>. <code>$[a,a]:= \{a\}$</code>: entartetes Intervall</p> Create LaTeX timetable http://martin-thoma.com/create-latex-timetable Tue, 18 Oct 2011 14:10:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/create-latex-timetable <p>LaTeX is a quite cool document markup language and document preparation system. You can easily create mathematical formulas.</p> <p>Today I&#39;ve created a LaTeX timetable. Well, to be honest I have only used the timetable package from Pascal Gwosdek found on <a href="http://www.planetk.de/index.php/Stundenplan">planetk.de</a>.</p> <p>Here is the LaTeX-Code:</p> <div class="highlight"><pre><code class="latex language-latex" data-lang="latex"><span class="k">\documentclass</span><span class="na">[a4paper,10pt]</span><span class="nb">{</span>report<span class="nb">}</span> <span class="c">% Definitions</span> <span class="k">\usepackage</span><span class="nb">{</span>lscape<span class="nb">}</span> <span class="k">\usepackage</span><span class="na">[height=25cm]</span><span class="nb">{</span>geometry<span class="nb">}</span> <span class="k">\usepackage</span><span class="nb">{</span>timetable<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span> <span class="k">\thispagestyle</span><span class="nb">{</span>empty<span class="nb">}</span> <span class="k">\begin</span><span class="nb">{</span>landscape<span class="nb">}</span> <span class="k">\noindent\printheading</span><span class="nb">{</span>Stundenplan von Martin Thoma - 1. Semester<span class="nb">}</span> <span class="c">% Define the layout of your time tables</span> <span class="k">\setslotsize</span><span class="nb">{</span>2.8cm<span class="nb">}{</span>0.3cm<span class="nb">}</span> <span class="k">\setslotcount</span> <span class="nb">{</span>5<span class="nb">}</span> <span class="nb">{</span>40<span class="nb">}</span> <span class="k">\settopheight</span><span class="nb">{</span>3<span class="nb">}</span> <span class="k">\settextframe</span><span class="nb">{</span>0.8mm<span class="nb">}</span> <span class="c">% Retro</span> <span class="k">\setframetype</span><span class="na">[t]</span><span class="nb">{</span>1<span class="nb">}</span> <span class="k">\seteventcornerradius</span><span class="nb">{</span>0pt<span class="nb">}</span> <span class="c">% Print timestamps into event blocks</span> <span class="c">%\setprinttimestamps{2}</span> <span class="c">% Define event types</span> <span class="k">\defineevent</span><span class="nb">{</span>lecture<span class="nb">}{</span>0.0<span class="nb">}</span> <span class="nb">{</span>0.28<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="k">\defineevent</span><span class="nb">{</span>exercise-course<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}</span> <span class="nb">{</span>0.4<span class="nb">}</span> <span class="nb">{</span>0.2<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="k">\defineevent</span><span class="nb">{</span>tutorial<span class="nb">}</span> <span class="nb">{</span>0.6<span class="nb">}</span> <span class="nb">{</span>0.8<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="k">\defineevent</span><span class="nb">{</span>langcourse<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}</span> <span class="nb">{</span>0.4<span class="nb">}</span> <span class="nb">{</span>0.2<span class="nb">}</span> <span class="nb">{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="k">\defineevent</span><span class="nb">{</span>work<span class="nb">}</span> <span class="nb">{</span>0.21<span class="nb">}{</span>0.5<span class="nb">}</span> <span class="nb">{</span>0.16<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}{</span>1.0<span class="nb">}</span> <span class="c">% Start the time table</span> <span class="k">\begin</span><span class="nb">{</span>timetable<span class="nb">}</span> <span class="k">\hours</span><span class="nb">{</span>8<span class="nb">}{</span>15<span class="nb">}{</span>1<span class="nb">}</span> <span class="k">\germandays</span><span class="nb">{</span>1<span class="nb">}</span> <span class="k">\event</span> 1 <span class="nb">{</span>0945<span class="nb">}</span> <span class="nb">{</span>1115<span class="nb">}</span> <span class="nb">{</span>Betriebssysteme<span class="nb">}</span> <span class="nb">{</span>Bellosa<span class="nb">}</span> <span class="nb">{</span>10.23 Nusselt<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 1 <span class="nb">{</span>1130<span class="nb">}</span> <span class="nb">{</span>1300<span class="nb">}</span> <span class="nb">{</span>Wahrscheinlichkeits-theorie<span class="nb">}</span> <span class="nb">{</span>Hug<span class="nb">}</span> <span class="nb">{</span>11.40 Tulla HS<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 1 <span class="nb">{</span>1400<span class="nb">}</span> <span class="nb">{</span>1530<span class="nb">}</span> <span class="nb">{</span>Programmieren<span class="nb">}</span> <span class="nb">{</span>Pretschner<span class="nb">}</span> <span class="nb">{</span>50.35 HS a. F.<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 1 <span class="nb">{</span>1545<span class="nb">}</span> <span class="nb">{</span>1715<span class="nb">}</span> <span class="nb">{</span>LinAlg und Ana<span class="nb">}</span> <span class="nb">{</span>Leuzinger<span class="nb">}</span> <span class="nb">{</span>30.46 Neue Chemie<span class="nb">}</span> <span class="nb">{</span>exercise-course<span class="nb">}</span> <span class="k">\event</span> 2 <span class="nb">{</span>0800<span class="nb">}</span> <span class="nb">{</span>0930<span class="nb">}</span> <span class="nb">{</span>Analysis I<span class="nb">}</span> <span class="nb">{</span>Schmoeger<span class="nb">}</span> <span class="nb">{</span>30.46 Neue Chemie<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 2 <span class="nb">{</span>0945<span class="nb">}</span> <span class="nb">{</span>1115<span class="nb">}</span> <span class="nb">{</span>Betriebssysteme<span class="nb">}</span> <span class="nb">{</span>Bellosa<span class="nb">}</span> <span class="nb">{</span>20.40 HS 37<span class="nb">}</span> <span class="nb">{</span>exercise-course<span class="nb">}</span> <span class="k">\event</span> 2 <span class="nb">{</span>1130<span class="nb">}</span> <span class="nb">{</span>1300<span class="nb">}</span> <span class="nb">{</span>Theoretische Grundlagen der Informatik<span class="nb">}</span> <span class="nb">{</span>Wagner<span class="nb">}</span> <span class="nb">{</span>30.21 Gerthsen<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 3 <span class="nb">{</span>0800<span class="nb">}</span> <span class="nb">{</span>0930<span class="nb">}</span> <span class="nb">{</span>LinAlg und Analytische Geometrie I<span class="nb">}</span> <span class="nb">{</span>Leuzinger<span class="nb">}</span> <span class="nb">{</span>10.21 Daimler<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 3 <span class="nb">{</span>1400<span class="nb">}</span> <span class="nb">{</span>1530<span class="nb">}</span> <span class="nb">{</span>Grundbegriffe der Informatik<span class="nb">}</span> <span class="nb">{</span>Schultz<span class="nb">}</span> <span class="nb">{</span>50.35 HS a. F.<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 4 <span class="nb">{</span>0800<span class="nb">}</span> <span class="nb">{</span>0930<span class="nb">}</span> <span class="nb">{</span>Analysis I<span class="nb">}</span> <span class="nb">{</span>Schmoeger<span class="nb">}</span> <span class="nb">{</span>30.46 Neue Chemie<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 4 <span class="nb">{</span>1130<span class="nb">}</span> <span class="nb">{</span>1300<span class="nb">}</span> <span class="nb">{</span>Theoretische Grundlagen der Informatik<span class="nb">}</span> <span class="nb">{</span>Wagner<span class="nb">}</span> <span class="nb">{</span>30.21 Gerthsen<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 5 <span class="nb">{</span>0800<span class="nb">}</span> <span class="nb">{</span>0930<span class="nb">}</span> <span class="nb">{</span>LinAlg und Analytische Geometrie I<span class="nb">}</span> <span class="nb">{</span>Leuzinger<span class="nb">}</span> <span class="nb">{</span>11.40 Tulla HS<span class="nb">}</span> <span class="nb">{</span>lecture<span class="nb">}</span> <span class="k">\event</span> 5 <span class="nb">{</span>0945<span class="nb">}</span> <span class="nb">{</span>1115<span class="nb">}</span> <span class="nb">{</span>Grundbegriffe der Informatik<span class="nb">}</span> <span class="nb">{</span>Schultz<span class="nb">}</span> <span class="nb">{</span>50.35 HS a. F.<span class="nb">}</span> <span class="nb">{</span>exercise-course<span class="nb">}</span> <span class="k">\event</span> 5 <span class="nb">{</span>1545<span class="nb">}</span> <span class="nb">{</span>1715<span class="nb">}</span> <span class="nb">{</span>Analysis I<span class="nb">}</span> <span class="nb">{</span>Schmoeger<span class="nb">}</span> <span class="nb">{</span>10.21 Benz<span class="nb">}</span> <span class="nb">{</span>exercise-course<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>timetable<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>landscape<span class="nb">}</span> <span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span> </code></pre></div> <p>Here is the <a href='../images/2011/10/timetable.sty'>timetable</a> and the <a href='../images/2011/10/example.tex'>example timtable in LaTeX</a>. If you have a Linux machine, you can create the timetable with this command: <code>bash pdflatex example.tex -output-format=pdf </code></p> Einführung in die Stochastik http://martin-thoma.com/einfuehrung-in-die-stochastik Mon, 17 Oct 2011 19:19:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/einfuehrung-in-die-stochastik <p>In diesem Artikel werde ich ein paar einfache Definitionen, die f&uuml;r die Stochastik wichtig sind, einf&uuml;hren. <h2>Basisdefinitionen bei Zufallsexperimenten</h2> <strong>Was ist ein ideales Zufallsexperiment?</strong> Ein ideales <a href="http://de.wikipedia.org/wiki/Zufallsexperiment">Zufallsexperiment</a> sollte <ul> <li>gut beschrieben,</li> <li>wiederholbar und</li> <li>mit mehreren m&ouml;glichen Ausg&auml;ngen (also zuf&auml;llig),</li> </ul> sein. Die Zufallsgr&ouml;&szlig;e, wie beispielsweise die erw&uuml;rfelte Zahl, nennt man <a href="http://de.wikipedia.org/wiki/Zufallsvariable">Zufallsvariable</a>. Es gibt auch noch die <a href="http://de.wikipedia.org/wiki/Statistische_Variable">Statistische Variable</a>. Wo der Unterschied ist, kann ich nicht sagen. Allerdings habe ich auf Wikipedia eine <a href="http://de.wikipedia.org/wiki/Diskussion:Statistische_Variable#Abgrenzung_Zufallsvariable_und_Statistische_Variable">Diskussion</a> ge&ouml;ffnet und hoffe auf baldige Kl&auml;rung.</p> <p><strong>Was sind Merkmale?</strong> Merkmale sind die Ausg&auml;nge eines Zufallsexperiments. Sie k&ouml;nnen folgenderma&szlig;en gegliedert werden: <ul> <li>quantitativ <small>(Die Zufallsgr&ouml;&szlig;e(n) haben nat&uuml;rlicherweise eine Ordnung)</small> <ul> <li>stetig <small>(Es k&ouml;nnen in einem Intervall beliebige Werte angenommen werden, z.B. die Gr&ouml;&szlig;e eines Menschen.)</small></li> <li>diskret <small>(Es k&ouml;nnen nur bestimmte Gr&ouml;&szlig;en angenommen werden, z.B. die Gr&ouml;&szlig;e eines Menschen in ganzen Zentimetern.)</small></li> </ul> </li> <li>qualitativ <small>(Es gibt keine nat&uuml;rliche Ordnung.)</small> <ul> <li>ordinal <small>(Es geht um Zahlengr&ouml;&szlig;en, z.B. Noten.)</small></li> <li>nominal <small>(Etwas v&ouml;llig anderes, z.B. Geschlecht.)</small></li> </ul> </li> </ul></p> <p><strong>Urliste / Stichprobe</strong> vom Umfang n: <code>$x := (x_1, x_2, ..., x_n)$</code> <code>$H_x (a_j) := \text{Anzahl der Stichprobenelemente in x, die gleich} a_j \text{sind}$</code> <code>$H_x (a_j)$</code> : <strong>Absolute H&auml;ufigkeit</strong> <code>$h_x(a_j) := \frac{H_x (a_j)}{n}$</code> : <strong>Relative H&auml;ufigkeit</strong> <strong>Empirische Verteilungsfunktion</strong> <code>$t \mapsto \underbrace{F_x(t)}_{\text{empirische Verteilungsfunktion}} := \sum \limits_{j: a_j \le t} {h_x (a_j)}, t \in \mathbb{R}$</code> Eine alternative Definition der <a href="http://de.wikipedia.org/wiki/Empirische_Verteilungsfunktion">empirischen Verteilungsfunktion</a> ist <code>$F_x(t) := \frac{1}{n} \sum \limits_{i=1}^n 1 \{ x_i \le t \}$</code></p> <p><strong>Arithmetisches Mittel</strong> (&quot;Durchschnitt&quot;): <code>$\overline x = \frac{1}{n} \sum \limits_{i=1}^n x_i = \frac{x_1 + ... + x_n}{n}$</code> Welcher Wert liegt in der Mitte?</p> <p><strong>Stichproben-Varianz</strong>: <code>$s_x^2 := \frac{1}{n-1} \sum \limits_{i = 1}^n (x_i - \overline x)^2$</code> <strong>Stichproben-Standardabweichung</strong>: <code>$s_x := + \sqrt{s_x^2}$</code> Wie stark weichen die Werte von einander ab?</p> <p><strong>Stichproben-Variationskoeffizient</strong>: <code>$v_x := \frac{s_x}{\overline x}$</code> Wie gro&szlig; ist die Schwankung relativ zum Durchschnitt?</p> <p><strong>Stichproben-Median / Zentralwert</strong>: W&uuml;rde mal alle Werte einer Stichprobe sortieren, sollte der Median der Wert in der Mitte sein. Das ist <em>nicht</em> der Durchschnitt! <code>$\tilde x := \begin{cases} x_{\frac{n+1}{2}}, &amp; \mbox{wenn } n \mbox{ ungerade} \\ \frac{1}{2} (x_\frac{n}{2} + x_{\frac{n}{2} + 1}), &amp; \mbox{wenn } n \mbox{ gerade} \end{cases}$</code></p> <p><strong>Quantil</strong>: Das Quantil unterteilt die Verteilung der Werte der Zufallsvariablen in zwei Bereiche: Links vom <code>$\alpha$</code>-Quantil liegen <code>$100 \cdot p$</code> Prozent aller Beobachtungswerte bzw. <code>$100 \cdot p$</code> Prozent der Gesamtzahl der Zufallswerte. Rechts davon liegen <code>$100 \cdot (1-p)$</code> Prozent aller Beobachtungswerte bzw. <code>$100 \cdot (1-p)$</code> Prozent der Gesamtzahl der Zufallswerte. </p> <p>Das Quartil ist das 0,25-Quantil.</p> <p><code>$\alpha$</code>-getrimmtes Stichprobenmittel: <code>$\overline x_\alpha := \frac{1}{n-2k} \cdot (x_{n+1} + ... + x_{n-k})$</code> Spezialfall: <code>$\overline x = \overline x_0$</code></p> <p>Quartilsabstand: <code>$\tilde x_{0,75} - \tilde x_{0,25}$</code> Spannweite: <code>$x_n - x_1$</code></p> <h2>Visualisierungen</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/boxplot-300x119.png"><img src="../images/2011/10/boxplot-300x119.png" alt="" width="300" height="119" class="size-medium wp-image-5981"/></a><p class="wp-caption-text"></p></div> <p>Weitere Visualisierungsm&ouml;glichkeiten: <ul> <li>Punktwolke</li> <li><a href="http://de.wikipedia.org/wiki/Streudiagramm">Streudiagramm</a></li> </ul></p> <h2>Ann&auml;herungen</h2> <p>Durch eine <a href="http://de.wikipedia.org/wiki/Regressionsanalyse">Regressionsanalyse</a> kann man ein Regressionsmodell erstellen. Es legt den Typ einer Regressionsfunktion fest. Eine Regressionsfunktion kann z.B. die <a href="http://de.wikipedia.org/wiki/Regressionsfunktion">Methode der kleinsten Quadrate</a> sein: <code>$\sum \limits_{j=1}^{n}\overbrace{(\underbrace{y_i -a -b \cdot x_j}_{\text{Residuum}})^2}^{ \begin{array}{l} \text{Damit sich negative positive}\\ \text{Abweichungen nicht gegenseitig}\\ \text{aufheben} \end{array} }$</code></p> <h3>Geradenparameter errechnen</h3> <p>Tja, hier hat er die Folien viel zu schnell durchgeschaltet ... ich habe nur folgendes:</p> <p>Regressionsgerade: <code>$y = a^* + b^* \cdot x$</code> (eindeutig bestimmbar) <code>$b^* = \frac{\sum \limits_{j=1}^n (x_j - \overline x) (y_j - \overline y)} {\sum \limits_{j = 1}^n (x_j - \overline x)^2}$</code></p> <p>und <code>$a^* = \overline y - b^* \cdot \overline x$</code></p> <p>mit <code>$r_{xy} = \frac{\frac{1}{n-1} \sum \limits_{j=1}^n (x_i - \overline x)(y_j - \overline y)} {b_x \cdot b_y}$</code> (Korrelationskoeffizient der Daten)</p> <p>gilt <code>$b^* = r_{xy} \cdot \frac{s_y}{s_x}$</code></p> <p>Irgendwas war noch mit der <a href="http://de.wikipedia.org/wiki/Cauchy-Schwarzsche_Ungleichung">Cauchy-Schwarz Ungleichung</a>.</p> <p>Falls jemand Anmerkungen hat, mehr mitgeschrieben hat oder einfach Fragen aufkommen: Postet doch einen Kommentar!</p> Password Changing Services http://martin-thoma.com/password-chaning-services Mon, 17 Oct 2011 06:10:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/password-chaning-services <p>Today I&#39;ve changed my PayPal password, because I thought it was time to do so. Now I know that the password changing service of PayPal can be improved quite a lot. I had to type the password about twelve times! This is the reason why I thought it was time to create some principles for good password chaning services:</p> <p><strong>User authentification</strong>: It is important that only the user can change the password. You have to force the user to type in his old password again. This should be done as a first step in the authentification. Nothing is more frustrating than beeing forced to type in your old password again and again as your new password wasn&#39;t valid. You could check if he typed in his old password less than a minute ago.</p> <p><strong>Eliminate typos</strong>: Like every good service, PayPal wants you to type the password and the verification. It would be good, if two symbols were added to the textbox. One for the activiation of <a href="http://en.wikipedia.org/wiki/Caps_lock">caps lock</a> and one for <a href="http://en.wikipedia.org/wiki/Num_lock">num lock</a>. I think this has to be done by the browser.</p> <p><strong>Clientside validation</strong>: The first time, I used a password which was considered as weak. A JavaScript informed me that it was weak, but I could submit the form. The form should be validated on the client. If it is not valid, don&#39;t let him submit the form. (The password has to be validated also on the server, of course.)</p> <p><strong>Allow all characters</strong>: I was very negatively surprised as I was informed that PayPal doesn&#39;t allow &quot;non-printable characters&quot; like spaces. They informed me after I submitted, of course. It does make sense to warn the user if he uses special characters which might be difficult to type on other systems, like german umlauts (&auml;&ouml;&uuml;&Auml;&Ouml;&Uuml;&szlig;). But why the hell do they force me to use underscores instead of spaces? Do they print my password? Do they want that I print my password?</p> <p><strong>Allow &quot;weak&quot; passwords</strong>: You should not allow weak passwords, of course. But you should have a good definition of weak. Less than 6 characters is weak. I wanted to use a 26-character password with upper- and lower case letters, spaces and one special character. This was considered as weak. If you read <a href="../md5-cracking/" title="MD5 cracking">my post about MD5 cracking</a> you have probably noticed, that it is much harder to crack a 26-character password with only lower case letters than a 8 character password with lower case, upper case and numbers. About <code>$10^{22}$</code> times as much passwords are possible with 26 characters and 26 letters than with a character-space of 62 elements but only 8 places (see <a href="http://www.wolframalpha.com/input/?i=26^26%2F%2826*2%2B10%29^8">Wolfram|Alpha</a>). You can easily build a password if you use a sentence, not a word. This will be long and will quite possibly only have lower case letters, spaces and one upper case letter, but it is possible to remember it. <div style="width: 740px" class="wp-caption aligncenter"><a href="http://imgs.xkcd.com/comics/password_strength.png"><img src="http://imgs.xkcd.com/comics/password_strength.png" alt="" width="740" height="601" class="size-medium"/></a><p class="wp-caption-text"></p></div></p> <p><strong>Allow long passwords</strong>: As the passwords should not be stored as plaintext, but hashed it doesn&#39;t really matter how long they are. If you use MD5, it will always take 32 characters. Why should you limit a user to only 20 characters (like PayPal does)? If the 26 character password is easier to remember, why do you want to restrict him to a shorter password which is easier to crack?</p> <p>I made the same annoying experiences with the password of my students account for university. They forced me to use a short password with a lower case and upper case letters, digits and special characters.</p> <p>Do you have some more suggestions for good passwords? Which websites have a very good password changing service?</p> MD5 cracking http://martin-thoma.com/md5-cracking Mon, 17 Oct 2011 05:36:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/md5-cracking <p>MD5 is a cryptographic hash function. This means, you can give the MD5 algorithm a string and it will return another 32-character long alphanumeric string. The returned string looks quite random, but it isn&#39;t. If you use the same input, you always get the same 32 character output.</p> <p>What is it good for?</p> <p>Well, imagine you had a web application. Now an attacker found a security whole and can read the password-column in the database. If it was plain text, he could use the passwords to log into the users accounts. As it is hashed and the hash function can&#39;t be simply reverted. So the attacker can&#39;t take any advantage of the passwords he just read.</p> <p>It is much more realistic that the attacker can read the whole database. So he can access sensitive user data. As it is very likely that you have some Email-Adresses in there, he could quite probably log into the Email-accounts of the users with the same password. If the password is hashed, it&#39;s not that simple. He has to try to crack the MD5 hashed passwords. </p> <p>I&#39;ll describe and test in the following how easy this is and how it could be done.</p> <h2>Tested Hashes</h2> <p>MD5 is a widely used cryptographic hash function. I wanted to know how easy it is to crack them, so I tested it. I used those passwords: <ul> <li>&quot;computer&quot;: df53ca268240ca76670c8566ee54568a</li> <li>&quot;establishment&quot;: f469410e5ec7594a9c41603e06ccf6a3</li> <li>&quot;My Birthday&quot;: ce9dbd008dac54422b90b3f82f58dd40</li> <li>&quot;I&#39;m born in 1990.&quot;: 834649b6298642a7576b10c6705842d8</li> <li>&quot;r4Nd0m9&quot;: cc11c3de28e4425eff27b2fb5f216903</li> </ul></p> <h2>Online Crackers</h2> <p>If you search for &quot;md5 cracker&quot; you find <a href="http://md5cracker.org/" rel="nofollow">some md5 crackers</a>. This website could crack <em>computer</em>, <em>establishment</em> and <em>My Birthday</em>. The other two hashes weren&#39;t cracked.</p> <h2>John the Ripper</h2> <p>Ubuntu-Users can easily install John the Ripper (sudo apt-get install john) and use it for cracking hashes. To do so, the have to create a file in their working directory (let&#39;s call it md5.txt) and execute the following command: </p> <div class="highlight"><pre><code class="bash">john --format<span class="o">=</span>raw-MD5 md5.txt </code></pre></div> <p>Here is the time, john needed to crack the hashes: <ul> <li>&quot;computer&quot;: 0.521 seconds</li> <li>&quot;establishment&quot;: after 1 h it wasn&#39;t cracked</li> <li>&quot;My Birthday&quot;: after 5 min it wasn&#39;t cracked</li> <li>&quot;I&#39;m born in 1990.&quot;: after 5 min it wasn&#39;t cracked</li> <li>&quot;r4Nd0m9&quot;: after 38 min it wasn&#39;t cracked</li> </ul></p> <p>Okay, these results aren&#39;t good. But you can also use a wordlist (e.g. the 15 MB list from http://www.bright-shadows.net/download/downloads.php) and the command john --wordlist:tbswordlist1.txt --format=raw-MD5 md5.txt <ul> <li>&quot;computer&quot;: df53ca268240ca76670c8566ee54568a</li> <li>&quot;establishment&quot;: 0.568 seconds</li> <li>&quot;My Birthday&quot;: not cracked</li> <li>&quot;I&#39;m born in 1990.&quot;: not cracked</li> <li>&quot;r4Nd0m9&quot;: not cracked</li> </ul></p> Challenge Websites http://martin-thoma.com/challenge-websites Tue, 11 Oct 2011 19:57:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/challenge-websites <p>Challenge websites are websites which offer many tasks to solve and a ranking system. If you solve the challenges, you get points and your rank increases. You don&#39;t get anything else. No money, no price. Only the knowledge and the ranking. Which is enough in my opinion. It might sound strange to others, but its fun to try to find the error in an application or to try to get better than others.</p> <p>The topics could be anything, but most of the time you should exploit a security whole.</p> <p>All Challenge websites I know use categories to organize their challenges. I&#39;ll describe some of them later. <h2>Why should challenge websites be more famous?</h2> Some people think its exciting to get to know the internals of a system. Questions like &quot;What will happen if I take the absolute value of -2,147,483,648?&quot; come automatically to their mind. <small>If you are not one of those guys, you might ask yourself &quot;Why -2147483648? Why not -1234?&quot;. Well, the simple answer is that in almost every programming language integers have 32 bytes. This means, you can store 2^32 values in this variable. As you have negative numbers, only 2^31 for each side. As you have 0, for one side one less. The range of an integer is in most languages -2^31 to +(2^31 -1). So if you take the absolute value of -2^31, you&#39;re out of that range.</small> It is much more interesting to get to know what could possibly go wrong in other systems and to show others your punditry than setting up an isolated system and trying to get unexpected results. If you don&#39;t know about challenge websites it is quite likely that you will try your knowledge on productive systems. This might result in a real damage.</p> <p>Another reason why challenge websites should get more famous is the moral compass. Even very young children can get an awfully amout of knowledge in computers. They might be able to hack others, but they don&#39;t have a feeling for whats wrong and right. If they try their knowledge in on a challenge website, they get a community they can talk to. I guess the administrators will not be happy if they exploit their systems, but if they tell them how to fix it I guess they would not go to the police. (As it is very likely that the attacker didn&#39;t really cause any damage like the loss of personal information or shutting down a system for which customers paid for, I think it is very unlikely that they will got to police.). I think it&#39;s very likely that they will give the credits for the patch / bug on their site. hacker.org does so, for example.</p> <p>I could also imagine that software companies could be interested in such websites. Wouldn&#39;t it be a great idea to post programming challenges and to contact the people who rank high? <h2>What are common categories?</h2> <h3>JavaScript</h3> JavaScript password protections are not secure. They are very easy to exploit and the website owner can be sure, that he will not open a real security leak when he creates such a challenge.</p> <p>Some common tasks include: <ul> <li>Looking into the source code of the webpage</li> <li>Deactivating JavaScript because you are redirected</li> <li>Understanding JavaScript</li> </ul> <h3>Exploit</h3> Many websites have server side bugs or vulnerabilities. So you can create challenges for &quot;hackers&quot; to find and exploit those to get to a hidden page. These exploits could be: <ul> <li><a title="http://en.wikipedia.org/wiki/SQL_injection" href="http://en.wikipedia.org/wiki/SQL_injection">SQL injections</a></li> <li><a title="Cross-site scripting" href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a></li> <li>Missing password protection</li> <li><a title="Code injection" href="http://en.wikipedia.org/wiki/Code_injection">Code injection</a></li> <li>Possible rights escalation</li> </ul> <h3>Cryptography</h3> <a title="http://en.wikipedia.org/wiki/Cryptography" href="http://en.wikipedia.org/wiki/Cryptography">Cryptography</a> is the practice and study of techniques for secure communication in the presence of third parties. This means you know that others will read your messages, but this doesn&#39;t mean they have to get to know what it means. They will only see rubbish and hopefully they don&#39;t know how to translate it into a meaningful sentence.</p> <p>As cryptography is older than computers you can find very many cryptographical challenges. One of the most common ones is the <a title="Caesar cipher" href="http://en.wikipedia.org/wiki/Caesar_cipher">Caesar cipher</a>.</p> <p>Most ciphers are in at least one of the following categories: <ul> <li>Classical Ciphers</li> <li>Substitution Ciphers</li> <li>Transposition Ciphers</li> <li>Block Ciphers</li> <li>Symmetrical Ciphers</li> <li>Asymmetrical Ciphers</li> </ul> <h3>Steganography</h3> Steganography is the art of hiding data. In the case of cryptography, your opponent knows that he has the information. In case of steganography he might think that he has only a nice picture. Did you ever use invisible ink as a child? Congratulations, you have already applied steganography!</p> <p>Some common steganographic challenges are: <ul> <li>Looking at the source code of a webpage</li> <li>Looking very exactly at a high resolution image</li> <li>Examining a .gif with multiple layers / a video</li> <li>Playing a sound really slow / fast</li> <li>Playing with the bits of an image</li> </ul> <h3>CrackIts</h3> CrackIts are challenges where you have to change a binary to get the results. Cracks are quite common. Perhaps you know that some illegal versions a very expesive software which can be found online don&#39;t need the registration code. They were cracked. <h3>Flash / Java Applets</h3> It is basically always decompiling and understanding the crappy output. As a reallife-application you could imagine an online game where you want to get into the highscore. Decompile it, look at the place where it gets submitted and submit your wished high score. <h3>Programming</h3> Programming challenges have a time component. You need to solve a specific instance of a problem in, well, lets say three seconds. Enough time for a computer to connect to the webpage, download the problem, solve it and upload the solution. Most of the time by far not enough to solve it by hand. <h3>Logic, Math and Science</h3> A classical logic challenge is the <a title="Sphinx riddle" href="http://en.wikipedia.org/wiki/Sphinx%27_riddle#The_Riddle_of_the_Sphinx">riddle of the Sphinx</a>. Another one is <a title="Einstein's Riddle" href="http://en.wikipedia.org/wiki/Zebra_Puzzle">Einstein&#39;s riddle</a>.</p> <p>I guess you can imagine what a math challenge is? 1 + 1 = x, solve to x would be one. The <a title="Impossible Puzzle" href="http://en.wikipedia.org/wiki/Impossible_Puzzle">Impossible Puzzle</a> would be another one.</p> <p>The science challenges are like the homework I had to do in school. Some are very difficult, others are quite easy. But the kind of quesions which were very simmilar to the questions in school. <h3>Information Gathering</h3> Almost every challenge could also be in the &quot;Information Gathering&quot; category. Who doesn&#39;t try Google first? (Except if the answer is obvious, of course.)</p> <p>Basic tasks are to get to know something about the owner of a specific website or about the content of a website a few years ago. <h2>Some examples</h2> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/bright-shadows-300x138.png"><img src="../images/2011/10/bright-shadows-300x138.png" alt="" width="300" height="138" class="size-medium wp-image-5301"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/hacker.org_-300x175.png"><img src="../images/2011/10/hacker.org_-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-5311"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/wechall-300x140.png"><img src="../images/2011/10/wechall-300x140.png" alt="" width="300" height="140" class="size-medium wp-image-5321"/></a><p class="wp-caption-text"></p></div> <p><a href="http://projecteuler.net/">ProjectEuler</a> - for people who are interested in math challenges: <img src="http://projecteuler.net/profile/moose.png"></p> When Geeks get Parents http://martin-thoma.com/when-geeks-get-parents Mon, 10 Oct 2011 05:54:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/when-geeks-get-parents <p>It&#39;s so funny what happens when Geeks get parents. </p> <p>This is what happens if your dad is a designer: <a href="../images/2011/10/baby-8.jpg"><img src="../images/2011/10/baby-8.jpg" alt="Baby" title="Baby" width="519" height="367" class="aligncenter size-full wp-image-5151" /></a></p> <p><a href="../images/2011/10/baby-9.jpg"><img src="../images/2011/10/baby-9.jpg" alt="Baby 9" title="Baby 9" width="520" height="367" class="aligncenter size-full wp-image-5161" /></a></p> <div style="width: 520px" class="wp-caption aligncenter"><a href="../images/2011/10/baby-batman.jpg"><img src="../images/2011/10/baby-batman.jpg" alt="" width="520" height="369" class="size-full wp-image-5171"/></a><p class="wp-caption-text"></p></div> <div style="width: 519px" class="wp-caption aligncenter"><a href="../images/2011/10/baby-hogan.jpg"><img src="../images/2011/10/baby-hogan.jpg" alt="" width="519" height="368" class="size-full wp-image-5181"/></a><p class="wp-caption-text"></p></div> <div style="width: 521px" class="wp-caption aligncenter"><a href="../images/2011/10/baby-ogre.jpg"><img src="../images/2011/10/baby-ogre.jpg" alt="" width="521" height="368" class="size-full wp-image-5191"/></a><p class="wp-caption-text"></p></div> <div style="width: 521px" class="wp-caption aligncenter"><a href="../images/2011/10/baby-soldier.jpg"><img src="../images/2011/10/baby-soldier.jpg" alt="" width="521" height="368" class="size-full wp-image-5201"/></a><p class="wp-caption-text"></p></div> <div style="width: 520px" class="wp-caption aligncenter"><a href="../images/2011/10/baby-vampire.jpg"><img src="../images/2011/10/baby-vampire.jpg" alt="" width="520" height="369" class="size-full wp-image-5211"/></a><p class="wp-caption-text"></p></div> <p>The Original (or at least the highest resolution I found) is <a href="http://sneezl.com/wp-content/uploads/2008/04/graphic-designer-baby.pdf">here as PDF</a>.</p> <p>Giving your child some funny T-shirts is also quite common: <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/geek-baby-no.jpg"><img src="../images/2011/10/geek-baby-no.jpg" alt="" width="400" height="400" class="size-full wp-image-5251"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 325px" class="wp-caption aligncenter"><a href="../images/2011/10/geek-baby-rpg.jpg"><img src="../images/2011/10/geek-baby-rpg.jpg" alt="" width="325" height="433" class="size-full"/></a><p class="wp-caption-text"></p></div> <p>A friend of mine just shared this photo: <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/10/geek-twins.jpg"><img src="../images/2011/10/geek-twins.jpg" alt="" width="320" height="238" class="size-full"/></a><p class="wp-caption-text"></p></div></p> <p>Do you have more images or perhaps stories of geeky parents? Please let me know in a comment!</p> Game: QWERTY Warriors 2 http://martin-thoma.com/game-qwerty-warriors-2 Sat, 08 Oct 2011 19:44:24 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/game-qwerty-warriors-2 <div style="width: 549px" class="wp-caption aligncenter"><a href="../images/2011/09/QWERTY-Warriors-2.png"><img src="../images/2011/09/QWERTY-Warriors-2.png" alt="" width="549" height="547" class="size-full wp-image-4971"/></a><p class="wp-caption-text"></p></div> <p><b>Go to the Game</b>: <a href="http://www.kongregate.com/games/Weasel/qwerty-warriors-2">QWERTY Warriors 2 on Kongregate</a> <b>Task</b>: Survive as long as possible. <b>How to play</b>: You have to type the enemy-words as fast as possible. Your figure will automatically shoot at them when you type. <b>My Record</b>: 118,486 (Final Score, see below) <div style="width: 549px" class="wp-caption aligncenter"><a href="../images/2011/10/QWERTY-Warriors-2-Score.png"><img src="../images/2011/10/QWERTY-Warriors-2-Score.png" alt="" width="549" height="549" class="size-full wp-image-4981"/></a><p class="wp-caption-text"></p></div></p> Order categories in WordPress http://martin-thoma.com/order-categories-in-wordpress Sat, 08 Oct 2011 12:18:19 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/order-categories-in-wordpress <p>Today, I&#39;ve introduced a new category: My bits and bytes. I wanted to write something about my <a href="../kitchen-renovation-part-1/">kitchen renovation</a>. Additionally, I thing I will write from time to time about other topics than computer related ones.</p> <p>As I looked at my categories, I saw that they were ordered lexicographically. But I called my Blog &quot;Code, the Web and Cyberculture&quot;, not &quot;Code, Cyberculture and the Web&quot;. So I had to change it.</p> <p>Lucily, a plugin called <a href="http://wordpress.org/extend/plugins/order-categories/">Category Orders</a> exists. It works fine with the latest WordPress (3.2.1):</p> <div style="width: 256px" class="wp-caption aligncenter"><a href="../images/2011/10/WordPress-Plugin-Category-Orders-256x300.png"><img src="../images/2011/10/WordPress-Plugin-Category-Orders-256x300.png" alt="" width="256" height="300" class="size-medium wp-image-4911"/></a><p class="wp-caption-text"></p></div> Kitchen renovation - Part 1 http://martin-thoma.com/kitchen-renovation-part-1 Sat, 08 Oct 2011 10:01:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/kitchen-renovation-part-1 <p>Most of you might know that I am currently a student. Living near the University is quite important for me as I hate traveling long. In the central part of <a href="http://en.wikipedia.org/wiki/Karlsruhe">Karlsruhe</a>, the city I study in, most houses are very old. The house I live in was built around 1900 and modernized from time to time. A heater and electricity were added, for example.</p> <p>The flat is shared by students. My hirer told me that he will pay all cost of materials if I wanted to improve something. As a new leaser came and we had no washing machine we thought it was time to renovate the kitchen. <h2>The old kitchen</h2> <h3>Why did I renovate?</h3> <ul> <li>We needed more space for a new washing machine.</li> <li>The old countertop was ugly, molded and had a water damage.</li> <li>The tap was loose.</li> <li>The tube for hot water was loose.</li> </ul> <h3>Some photos</h3> <div style="width: 600px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-before-countertop.jpg"><img src="../images/2011/10/kitchen-before-countertop.jpg" alt="" width="600" height="450" class="size-full wp-image-4281"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 375px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-before-countertop-old.jpg"><img src="../images/2011/10/kitchen-before-countertop-old.jpg" alt="" width="375" height="500" class="size-full wp-image-4301"/></a><p class="wp-caption-text"></p></div> <div style="width: 600px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-before-countertop-old-top.jpg"><img src="../images/2011/10/kitchen-before-countertop-old-top.jpg" alt="" width="600" height="450" class="size-full wp-image-4331"/></a><p class="wp-caption-text"></p></div> <h2>Plans</h2> <div style="width: 674px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-before-plan.png"><img src="../images/2011/10/kitchen-before-plan.png" alt="" width="674" height="458" class="size-full wp-image-4551"/></a><p class="wp-caption-text"></p></div> <div style="width: 675px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-after-plan.png"><img src="../images/2011/10/kitchen-after-plan.png" alt="" width="675" height="459" class="size-full wp-image-4561"/></a><p class="wp-caption-text"></p></div> <h2>The renovation</h2> <h3>Tools</h3> <p>I needed quite a lot of tools. I had to buy most of them when I saw that I couldn&#39;t continue without them:</p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-drilling-machine.jpg"><img src="../images/2011/10/tool-drilling-machine.jpg" alt="" width="400" height="255" class="size-full wp-image-4571"/></a><p class="wp-caption-text"></p></div> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-plumber-wrench.jpg"><img src="../images/2011/10/tool-plumber-wrench.jpg" alt="" width="400" height="127" class="size-full wp-image-4581"/></a><p class="wp-caption-text"></p></div> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-screwdriver.jpg"><img src="../images/2011/10/tool-screwdriver.jpg" alt="" width="400" height="198" class="size-full wp-image-4591"/></a><p class="wp-caption-text"></p></div> <div style="width: 500px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-silicone-cartridge.jpg"><img src="../images/2011/10/tool-silicone-cartridge.jpg" alt="" width="500" height="254" class="size-full wp-image-4611"/></a><p class="wp-caption-text"></p></div> <div style="width: 600px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-spirit-level.jpg"><img src="../images/2011/10/tool-spirit-level.jpg" alt="" width="600" height="120" class="size-full wp-image-4621"/></a><p class="wp-caption-text"></p></div> <div style="width: 290px" class="wp-caption aligncenter"><a href="../images/2011/10/tool-wrench.jpg"><img src="../images/2011/10/tool-wrench.jpg" alt="" width="290" height="350" class="size-full wp-image-4631"/></a><p class="wp-caption-text"></p></div> <p>Additionally I needed a hammer to get the wall plugs into the wall, some different screws and wall plugs, pliers, some tubes and some <a href="http://en.wikipedia.org/wiki/O-ring">O-rings</a>.</p> <h3>Photos while working</h3> <div style="width: 196px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-crooked-wall2-196x300.jpg"><img src="../images/2011/10/kitchen-working-crooked-wall2-196x300.jpg" alt="" width="196" height="300" class="size-medium wp-image-4641 "/></a><p class="wp-caption-text"></p></div> <div style="width: 225px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-after-heating-pipe-225x300.jpg"><img src="../images/2011/10/kitchen-after-heating-pipe-225x300.jpg" alt="" width="225" height="300" class="size-medium wp-image-4671 "/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-washing-machine-300x225.jpg"><img src="../images/2011/10/kitchen-working-washing-machine-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4741"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-loose-tube-300x225.jpg"><img src="../images/2011/10/kitchen-working-loose-tube-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4821"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-ledge2-300x225.jpg"><img src="../images/2011/10/kitchen-working-ledge2-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4721"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-connection-300x214.jpg"><img src="../images/2011/10/kitchen-working-connection-300x214.jpg" alt="" width="300" height="214" class="size-medium wp-image-4811"/></a><p class="wp-caption-text"></p></div> <div style="width: 259px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-tab-259x300.jpg"><img src="../images/2011/10/kitchen-working-tab-259x300.jpg" alt="" width="259" height="300" class="size-medium wp-image-4831"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-angle-joints-300x225.jpg"><img src="../images/2011/10/kitchen-working-angle-joints-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4801"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-working-silicone-leftovers-300x225.jpg"><img src="../images/2011/10/kitchen-working-silicone-leftovers-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4711"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-masked-countertop-300x225.jpg"><img src="../images/2011/10/kitchen-masked-countertop-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4701"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-after-baseboard-300x225.jpg"><img src="../images/2011/10/kitchen-after-baseboard-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4781"/></a><p class="wp-caption-text"></p></div> <h2>The new kitchen</h2> <div style="width: 600px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-after.png"><img src="../images/2011/10/kitchen-after.png" alt="" width="600" height="450" class="size-full wp-image-4651"/></a><p class="wp-caption-text"></p></div> <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/10/kitchen-after-exact-work-300x225.jpg"><img src="../images/2011/10/kitchen-after-exact-work-300x225.jpg" alt="" width="300" height="225" class="size-medium wp-image-4771"/></a><p class="wp-caption-text"></p></div> <h2>Conclusion</h2> <p>I am proud of the result. The new kitchen looks nice, the countertop is very exact horizontally, no water drips out. Some parts could have been done better (like the silicone clogging), but I guess most could not be much better.</p> <p>The next time I do something like this I will hopefully not have to go about ten times to the hardware store :-/ Now I have some more tools :D</p> 5 Web Technologies which should be used more often http://martin-thoma.com/5-web-technologies-which-should-be-used-more-often Sat, 08 Oct 2011 04:21:25 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/5-web-technologies-which-should-be-used-more-often <div style="width: 100px" class="wp-caption alignright"><a href="../images/2011/10/RSS-Feeds.png"><img src="../images/2011/10/RSS-Feeds.png" alt="" width="100" height="100" class="size-full wp-image-4411"/></a><p class="wp-caption-text"></p></div> <h2>RSS-Feeds</h2> <p>Everyone who wants to get informed about updates on websites has to use RSS Feeds. Every time any website you have in your Feed Reader makes an update, you can get instantly a little notice. Its a bit like Email, but you have the possibility to stop this service. You can&#39;t get spam, as the Feed owner doesn&#39;t get an identifier for you.</p> <div style="width: 100px" class="wp-caption alignright"><a href="../images/2011/10/OpenID.png"><img src="../images/2011/10/OpenID.png" alt="" width="100" height="100" class="size-full wp-image-4431"/></a><p class="wp-caption-text"></p></div> <h2>OpenID</h2> <p>It is really annoying to register on every single page you use. The idea behind OpenID is having one account for registering on many domains. If you want to log-in in Blogger, you are sent to Google. You type in your username and password and Google sends you back to Blogger. </p> <p>Here is another explanation: <iframe title="YouTube video player" class="youtube-player" type="text/html" width="512" height="414" src="http://www.youtube.com/embed/xcmY8Pk-qEk" frameborder="0" allowFullScreen></iframe></p> <p>The process seems to be too complex for many users, so Google developed the <a href="http://code.google.com/intl/de-DE/apis/identitytoolkit/index.html">Google Identity Toolkit</a> (GIT). The technique is really nice, but I don&#39;t like the idea that I have to force my users to use Google (or a service of them). Though I use Google for almost everything.</p> <h2>Ajax</h2> <p><a href="http://en.wikipedia.org/wiki/Ajax_(programming)" rel="nofollow">Ajax</a> is a programming style. If you like to view another page or get some information which isn&#39;t already loaded, you don&#39;t have to reload the whole page. The Pages simply display the new content as soon as it has loaded the content. GMail makes heavy use of Ajax.</p> <h2>Hierarchical Labels</h2> <p>Well, I guess this is less a technology than an idea. I think it would be gread if labels were used more often. I&#39;d like to sort my personal files with labels, not with folders. The advantage of labels in comparison with folders is that you can add any number of labels to one object (file, email, ...). But you can have a file only in one path if you don&#39;t copy the file. So you have to know how the person is thinking, if you want to find the file you are searching for.</p> <p>Example: You search for a file about you favorite books. Unfortunately, you don&#39;t remember if it was an Excel-file or a Word-file. Now you have this tree structure:</p> <ul> <li>Excel</li> <li>Documents <ul> <li>School</li> <li>Emails</li> <li>eBooks</li> <li>Math</li> </ul> <p></li> <li>School <ul> <li>Biology</li> <li>Chemistry</li> <li>English</li> <li>Math</li> </ul> </li> <li>Word</li> </ul></p> <p>The document you a re searching for could be in Word; in School/English, in Documents/eBooks or in Excel. You you had labels for your files, you could just select the files with a &quot;Books&quot;-label.</p> <p>I wrote &quot;Hierarchical Labels&quot;, because sometimes you have one label, that comes always with another one, but not the other way round. As I am not very interested in chemistry, all files about chemistry were for school. So if I tagged a file with &quot;chemistry&quot; it should automatically get the &quot;school&quot;-tag.</p> <div style="width: 63px" class="wp-caption alignright"><a href="../images/2011/10/Gravatar-Logo.png"><img src="../images/2011/10/Gravatar-Logo.png" alt="" width="63" height="63" class="size-full wp-image-4441"/></a><p class="wp-caption-text"></p></div> <h2>Gravatar</h2> <p>Have you ever noticed <a href="http://www.sembeo.com/ninja/comment-page-2/" rel="nofollow">blogs</a> or <a href="http://stackoverflow.com/questions/4880891/javascript-settimeout-and-changes-to-system-time-cause-problems" rel="nofollow">other</a> sites where some people have avatars and others don&#39;t? Sometimes, if a possibility to login is provided this is not really amazing. But where does the website get the pictures from if there is no possibility to log in?</p> <p><a href="http://en.wikipedia.org/wiki/Gravatar" rel="nofollow">Gravatar</a> (an abbreviation for globally recognized avatar) is a service for providing globally-unique avatars. This is good for any website, where you don&#39;t have the possibility to store large amounts of data or you don&#39;t want to be annoyed with different file types, resizing and users who can&#39;t manage to use your software.</p> <p><a href="http://lea.verou.me/demos/gravatar.php?email=info%40martin-thoma.de">Here</a> is a web service, that allows you to quickly see the Gravatars of one email address.</p> <h2> Links for developers</h2> <ul> <li><a href="http://openid.net/developers/libraries/" rel="nofollow">OpenID libraries</a></li> <li><a href="http://de.gravatar.com/site/implement/hash/" rel="nofollow">Working with Gravatar</a></li> <li><a href="http://www.petefreitag.com/item/465.cfm" rel="nofollow">Howto Create an RSS 2.0 Feed</a></li> </ul> Clip: What Light http://martin-thoma.com/clip-what-light Tue, 04 Oct 2011 21:07:51 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/clip-what-light <iframe width="560" height="315" src="http://www.youtube.com/embed/5BnVtz92Ius?rel=0" frameborder="0" allowfullscreen></iframe> Comparing Dates in PHP and MySQL http://martin-thoma.com/comparing-dates-in-php-and-mysql Tue, 04 Oct 2011 18:22:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/comparing-dates-in-php-and-mysql <p>Sometimes you need to know compare PHP dates. You need to know what is later or if both dates are the same.</p> <h2>PHP</h2> <h3>time formats and functions</h3> <p>PHP knows these time / date formats: <ul> <li>UNIX Timestamp: Integer - The number of seconds after 1970. Related functions are <ul> <li>int <a href="http://www.php.net/manual/en/function.mktime.php">mktime</a>([ int <code>$hour = date(&quot;H&quot;) [, int $</code>minute = date(&quot;i&quot;) [, int <code>$second = date(&quot;s&quot;) [, int $</code>month = date(&quot;n&quot;) [, int <code>$day = date(&quot;j&quot;) [, int $</code>year = date(&quot;Y&quot;) [, int <code>$is_dst = -1 ]]]]]]])&lt;/li&gt; &lt;li&gt;int &lt;a href=&quot;http://www.php.net/manual/en/function.time.php&quot;&gt;time&lt;/a&gt;()&lt;/li&gt; &lt;li&gt;string &lt;a href=&quot;http://www.php.net/manual/en/function.date.php&quot;&gt;date&lt;/a&gt;( string $</code>format [, int <code>$timestamp = time() ] )&lt;/li&gt; &lt;li&gt;int &lt;a href=&quot;http://www.php.net/manual/en/function.strtotime.php&quot;&gt;strtotime&lt;/a&gt; ( string $</code>time [, int <code>$now ] ) I recommend using &#39;YYYY-MM-DD HH:mm:ss&#39; if possible.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Associative Arrays. The array looks like this [php]Array ( [year] =&gt; 2006 [month] =&gt; 12 [day] =&gt; 12 [hour] =&gt; 10 [minute] =&gt; 0 [second] =&gt; 0 [fraction] =&gt; 0.5 [warning_count] =&gt; 0 [warnings] =&gt; Array() [error_count] =&gt; 0 [errors] =&gt; Array() [is_localtime] =&gt; )[/php] The related functions are: &lt;ul&gt; &lt;li&gt;array &lt;a href=&quot;http://www.php.net/manual/en/function.date-parse.php&quot;&gt;date_parse&lt;/a&gt; (string $</code>date)</li> <li>array <a href="http://php.net/manual/en/function.getdate.php">getdate</a> ([ int `$timestamp = time() ] )</li> </ul> </li> <li><a href="http://php.net/manual/en/class.datetime.php">DateTime Class</a>: This class can do quite a lot. You should read the manual if you&#39;re interested in using it.</li> </ul></p> <h3>Comparisons</h3> <p>Comparing UNIX Timestamps is like comparing integers. No problem. </p> <p>Comparing Arrays is more interesting. What do you think will the following script print? [php]&lt;?php</p> <p>$<code>d1 = date_parse (&quot;2011-05-11&quot;); </code>$d2 = date_parse (&quot;2011-05-11 13:00:00&quot;);</p> <p>print_r($<code>d1); print_r(</code>$d2);</p> <p>if ($<code>d1 &lt;</code>$d2) { echo &#39;$<code>d1 is less than</code>$d2.&#39;; } else if ($<code>d1 ==</code>$d2) { echo &#39;$<code>d1 is equal to</code>$d2.&#39;; } else { echo &#39;$<code>d1 is greater than</code>$d2.&#39;; }</p> <p>?&gt;[/php]</p> <p>It prints &#39;$<code>d1 is less than</code>$d2.&#39; as [php]date<em>parse (&quot;2011-05-11&quot;);[/php] is basically the same as [php]date</em>parse (&quot;2011-05-11 00:00:00&quot;);[/php]</p> <p>You can compare the Array to an integer, but I don&#39;t know what PHP does. It seems as if the array would always be considered as beeing greater. If you use the functions you&#39;ll be fine.</p> <h2>MySQL</h2> <h3>time formats and functions</h3> <p>MySQL knows these date and time <a href="http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html">types</a> and those <a href="http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html">functions</a>. Here is a very short overview: <ul> <li><a href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">DATETIME</a>: &#39;YYYY-MM-DD HH:MM:SS&#39; range is from &#39;1000-01-01 00:00:00&#39; to &#39;9999-12-31 23:59:59&#39;</li> <li><a href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">DATE</a>: &#39;YYYY-MM-DD&#39; range is from &#39;1000-01-01&#39; to &#39;9999-12-31&#39;</li> <li><a href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">TIMESTAMP</a>: like DATETIME, but range is from &#39;1970-01-01 00:00:01&#39; UTC to &#39;2038-01-19 03:14:07&#39; UTC</li> </ul></p> <p>Those examples show more than a long explanation:</p> <div class="highlight"><pre><code class="bash">mysql&gt; SELECT CURTIME<span class="o">()</span><span class="p">;</span> -&gt; <span class="s1">&#39;23:50:26&#39;</span> <span class="c"># Adding zero will NOT convert it to a UNIX timestamp:</span> mysql&gt; SELECT CURTIME<span class="o">()</span> + 0<span class="p">;</span> -&gt; 235026.000000 <span class="c"># An &quot;integered&quot; TIME</span> mysql&gt; SELECT NOW<span class="o">(</span> <span class="o">)</span> -&gt; <span class="s1">&#39;2011-10-04 18:33:45&#39;</span> <span class="c"># Adding zero is a bad idea here, too:</span> mysql&gt; SELECT NOW<span class="o">(</span> <span class="o">)</span> +0 -&gt; 20111004190945.000000 <span class="c"># An &quot;integered&quot; DATETIME</span> <span class="c"># If you want a UNIX Timestamp, use this function</span> mysql&gt; SELECT UNIX_TIMESTAMP<span class="o">()</span><span class="p">;</span> -&gt; 1317746025 mysql&gt; SELECT UNIX_TIMESTAMP<span class="o">(</span><span class="s1">&#39;2011-10-04 18:33:45&#39;</span><span class="o">)</span><span class="p">;</span> -&gt; 1317746025 <span class="c"># You can also convert it:</span> mysql&gt; SELECT UNIX_TIMESTAMP<span class="o">(</span><span class="sb">`</span>my_datetime_row<span class="sb">`</span><span class="o">)</span> FROM <span class="sb">`</span>my_table<span class="sb">`</span> </code></pre></div> <h3>Comparisons</h3> <p>You can compare two DATETIMEs like this: [sql]SELECT <code>my_row</code> FROM <code>my_table</code> WHEN <code>datetime1</code> &lt; <code>datetime2</code>[/sql]</p> <p>It&#39;s of course not problem if you compare two UNIX Timestamps which are stored as integers in the database: [sql]SELECT <code>my_row</code> FROM <code>my_table</code> WHEN <code>int1</code> &lt; <code>int2</code>[/sql]</p> <p>But what happens if you compare a DATETIME with a Timestamp (integer)? [sql]SELECT <code>my_row</code> FROM <code>my_table</code> WHEN <code>datetime1</code> &lt; UNIX<em>TIMESTAMP()[/sql] This is basically: [sql]SELECT <code>my_row</code> FROM <code>my_table</code> WHEN <code>datetime1</code> &lt; 1317750167[/sql] And it compares the &quot;integered&quot; DATETIME 20111004210710 for 2011-10-04 21:07:10 with 1317750167. This is obviously crap. Don&#39;t do it. Never. Instead you should convert your dates with UNIX</em>TIMESTAMP(your<em>datetime) or FROM</em>UNIXTIME(unix_timestamp).</p> <h2>Comparing MySQL types with PHP types</h2> <p>The simplest way to compare MySQL DATE formats with PHP types is using strtotime(...) or date(...) if needed. If you have a DATETIME and you want to know if it&#39;s in the past, you can use [php]if (strtotime($<code>datetime) &lt; time()) { echo &#39;</code>$datetime is in the past.&#39;; }[/php]</p> <h2>From PHP to MySQL</h2> <p>If you have a date you got via an date input field and want to submit it to MySQL, just use this piece of code: [php]$`mysqlFormat = date(&#39;Y-m-d H:i:s&#39;, strtotime($<em>POST[&#39;my</em>date&#39;]));[/php]</p> Motion of the sun http://martin-thoma.com/motion-of-the-sun Sun, 02 Oct 2011 07:25:07 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/motion-of-the-sun <p>How is the sun moving, according to our latitude, the time of the day and the time of the year? Just take a look at <a href="http://astro.unl.edu/naap/motion3/animations/sunmotions.swf">astro.unl.edu</a> and find it out! <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/Motions-of-the-sun.png"><img src="../images/2011/10/Motions-of-the-sun.png" alt="" width="400" height="186" class="size-full wp-image-3601"/></a><p class="wp-caption-text"></p></div></p> Compare Planet Sizes http://martin-thoma.com/compare-planet-sizes Sat, 01 Oct 2011 09:29:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/compare-planet-sizes <p>The diameter of Mercury measures about 4880 km. Can you imagine how much that is? I could not. But with <a href="http://www.sciencenetlinks.com/interactives/messenger/psc/PlanetSize.html">www.sciencenetlinks.com</a> you can compare it with the earth:</p> <div style="width: 400px" class="wp-caption aligncenter"><a href="../images/2011/10/Planet-Size-Comparison.png"><img src="../images/2011/10/Planet-Size-Comparison.png" alt="" width="400" height="317" class="size-full wp-image-3351"/></a><p class="wp-caption-text"></p></div> <p>By the way, if you are interested in the universe, you should go to a <a href="http://en.wikipedia.org/wiki/Planetarium">planetarium</a>. You can search the next one with <a href="http://maps.google.com/maps?f=q&source=s_q&hl=de&geocode=&q=planetarium+in+england&aq=&sll=52.629729,-1.318359&sspn=7.190682,19.753418&ie=UTF8&hq=planetarium&hnear=England,+Vereinigtes+K%C3%B6nigreich&ll=52.469397,-1.252441&spn=7.553141,19.753418&t=h&z=6">maps.google.com</a>. In Augsburg (Germany) it costs less than going to a 3D-cinema, but the movie showen in the planetarium is in 3D.</p> Game: Z-Type http://martin-thoma.com/game-z-type Sat, 01 Oct 2011 08:36:41 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/game-z-type <div style="width: 168px" class="wp-caption aligncenter"><a href="../images/2011/10/z-type-168x300.png"><img src="../images/2011/10/z-type-168x300.png" alt="" width="168" height="300" class="size-medium wp-image-3311"/></a><p class="wp-caption-text"></p></div> <p><b>Go to the Game</b>: <a href="http://www.phoboslab.org/ztype/" rel="nofollow">www.phoboslab.org/ztype</a> <b>Task</b>: Survive as long as possible <b>How to play</b>: Type the words which appear at the top as fast as possible. The ship shoots at the words. <b>My Record</b>: Final Score: 1505 with Accuracy of 94.2% <b>Programming</b>: This game is written in JavaScript with <a href="http://impactjs.com/" rel="nofollow">Impact</a>.</p> Facepalm http://martin-thoma.com/facepalm Fri, 30 Sep 2011 12:22:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/facepalm <p>With the Internet came a lot of new words. <a href="http://en.wikipedia.org/wiki/Cyberculture">Cyberculture</a> could be one of them, <a href="http://en.wikipedia.org/wiki/Google_(verb)">Googling</a> or <a href="http://en.wikipedia.org/wiki/Hacktivism">Hacktivism</a> would be others.</p> <p>Did you know that the famous gesture of Piccard is called a <a href="http://en.wikipedia.org/wiki/Facepalm">Facepalm</a>? <div style="width: 128px" class="wp-caption aligncenter"><a href="../images/2011/09/Piccard-Facepalm.jpg"><img src="../images/2011/09/Piccard-Facepalm.jpg" alt="" width="128" height="128" class="size-full wp-image-3171"/></a><p class="wp-caption-text"></p></div></p> <p>The same word seems to exist also in German, so I&#39;m quite sure that the word is new. (Although the <a href="http://en.wikipedia.org/wiki/Duden">Duden</a> doesn&#39;t know it.)</p> <p>Although the gesture itself is obviously old:</p> <div style="width: 394px" class="wp-caption aligncenter"><a href="../images/2011/09/Cain_Henri_Vidal_Tuileries.jpg"><img src="../images/2011/09/Cain_Henri_Vidal_Tuileries.jpg" alt="" width="394" height="600" class="size-full wp-image-3181"/></a><p class="wp-caption-text"></p></div> If Computer Problems Were Real http://martin-thoma.com/if-computer-problems-were-real Fri, 30 Sep 2011 11:39:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/if-computer-problems-were-real <p>Before the computer ... ... a memory was something you&#39;ve lost with age ... an application was for employment ... a program was a TV show ... a cursor used profanity ... a keyboard was a piano ... a web was a spiders home ... a virus was the flue ... a CD was a bank account ... a hard drive was a long trip on the road ... a mouse pad was where a mouse lived ... a tree, leaf and root could be found in nature ... a path was wa way and if you had a 3,5 inch floppy... ... you hoped nobody found out.</p> <p>If you like this kind of humor, you might want to watch this video:</p> <iframe width="640" height="360" src="http://www.youtube.com/embed/kAG39jKi0lI?rel=0" frameborder="0" allowfullscreen></iframe> <p>Thanks to Javier Benek for <a href="http://www.flickr.com/photos/xbenek/2449405807/sizes/m/in/photostream/">the picture</a>.</p> Colorize your scripts output http://martin-thoma.com/colorize-your-scripts-output Fri, 30 Sep 2011 06:59:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/colorize-your-scripts-output <p>The bash is very nice if you want to know exactly what your scripts are doing. Unfortunately, its almost always white colored text on a black background, without any accentuation. No bold text, nothing underlined and no colors are used.</p> <p>You can change this standard behaviour. You can add color to your output.</p> <p>This is the way you do it:</p> <p>The mini-program tput can initialize a terminal or query terminfo database. If you want to know more about it, you can take a look at the <a href="http://linux.die.net/man/1/tput">tput manpage</a>.</p> <h2>A quick example</h2> <div class="highlight"><pre><code class="bash"><span class="c"># Text color variables</span> <span class="nv">txtred</span><span class="o">=</span><span class="sb">`</span><span class="k">$(</span>tput setaf 1<span class="k">)</span> <span class="c"># Red</span> <span class="nv">txtreset</span><span class="o">=</span><span class="nv">$`</span><span class="o">(</span>tput sgr0<span class="o">)</span> <span class="c"># Reset your text</span> <span class="nb">echo</span> <span class="s2">&quot;Roses are `${txtred}red$`{txtreset}.&quot;</span> </code></pre></div> <p>Simply copy this example line by line and then you&#39;ll see the expected example.</p> <p>A shorter way would be</p> <div class="highlight"><pre><code class="bash"><span class="nb">echo</span> <span class="s2">&quot;Roses are `tput setaf 1`red`tput sgr0`.&quot;</span> </code></pre></div> <h2>The sgr attribuge</h2> <div class="highlight"><pre><code class="bash">tput sgr 0 1 turn off standout<span class="p">;</span> turn on underline tput sgr 0 0 turn off standout<span class="p">;</span> turn off underline tput sgr 1 1 turn on standout<span class="p">;</span> turn on underline tput sgr 1 0 turn on standout<span class="p">;</span> turn off underline tput sgr0 short <span class="k">for </span>sgr 0 0 </code></pre></div> <h2>The setaf attribute</h2> <div class="highlight"><pre><code class="bash">setaf 1 Red setaf 2 Green setaf 3 Yellow setaf 4 Blue setaf 5 Purple setaf 6 Cyan setaf 7 Gray </code></pre></div> <h2>Misc</h2> <p>Make your text bold:</p> <div class="highlight"><pre><code class="bash">tput bold </code></pre></div> <p>Reset your style:</p> <div class="highlight"><pre><code class="bash">tput sgr0 </code></pre></div> <h2>Advanced Example</h2> <p>Imagine you had a script which generated much output. All messages are important for you, but some are more important than others. You definitely want to see all &quot;[ERROR]&quot; output. So you want to apply a red and bold modification to the stream.</p> <p>This is the way how &quot;[ERROR]&quot; gets red and bold:</p> <div class="highlight"><pre><code class="bash"><span class="sb">`</span>tput setaf 1<span class="sb">``</span>tput bold<span class="sb">`</span><span class="o">[</span>ERROR<span class="o">]</span><span class="sb">`</span>tput sgr0<span class="sb">`</span> </code></pre></div> <p>You can test it with</p> <div class="highlight"><pre><code class="bash"><span class="nb">echo</span> <span class="s2">&quot;`tput setaf 1``tput bold`[ERROR]`tput sgr0`&quot;</span> </code></pre></div> <p>I&#39;ve created a little python script called output.py for testing purposes. It simply outputs a quite long <a href="http://en.wikipedia.org/wiki/Lorem_ipsum">Lorem ipsum</a> text with some random [ERROR] messages.</p> <p>The next task is to replace the [ERROR] messages. The tool of my choice is sed. See the <a href="http://linux.die.net/man/1/sed">sed man page</a> for more information. The basic usage is </p> <div class="highlight"><pre><code class="bash">sed <span class="s1">&#39;s/search/replace/&#39;</span> </code></pre></div> <p>So we pipe the output to sed:</p> <div class="highlight"><pre><code class="bash">python output.py <span class="p">|</span> sed <span class="s1">&#39;s/\[ERROR\]/MYLOOOOOOOOOOOOOOOOOONGTEST/&#39;</span> </code></pre></div> <p>And now we bring it all together:</p> <div class="highlight"><pre><code class="bash">python output.py <span class="p">|</span> sed <span class="s1">&#39;s/[ERROR]/`tput setaf 1``tput bold`[ERROR]`tput sgr0`/&#39;</span> </code></pre></div> <p>Doesn&#39;t work? Well, lets analyse it. Instead of replacing <code>tput setaf 1</code> it gets printed directly. This means, something we did prevented the bash of replacing our command. If you look carefully at the command, you might see that I used &#39; instead of &quot;. If you change this, everything is fine:</p> <div class="highlight"><pre><code class="bash">python output.py <span class="p">|</span> sed <span class="s2">&quot;s/\[ERROR\]/`tput setaf 1``tput bold`[ERROR]`tput sgr0`/&quot;</span> </code></pre></div> <h2>Colorize C / C++ output</h2> <p>You need <a href="http://en.wikipedia.org/wiki/ANSI_escape_code">ANSI color codes</a>:</p> <div class="highlight"><pre><code class="c"><span class="cp">#include &lt;stdio.h&gt;</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[30m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;black?&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[31m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;red&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[32m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;lime&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[33m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;yellow&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[34m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;blue&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[35m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;gray&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[36m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;blue&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[37m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;light gray&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[38m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;black?&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[39m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;black?&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[41m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;red background&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[1;34m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;bold and blue&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[4m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;underlined&quot;</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">&quot;&amp;#92;&amp;#48;33[9m%s&amp;#92;&amp;#48;33[0m</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;strike&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </code></pre></div> <p>\033 is the ASCII 27 ESC character. It has to be followed by &quot;[&quot;. After that you can write one or two numbers separated by &quot;;&quot;. Then you have to write &quot;m&quot;. You can get back to standard output with &quot;\033[0m&quot;. The numbers 30&ndash;37 change the color, 4 is a single underline.</p> <p>I guess these will also work for Java, but I didn&#39;t test it.</p> <p>Do you know what setaf or sgr stand for? Do you know further &quot;terminal enhancement&quot; tricks? Just leave a post!</p> CAPTCHA http://martin-thoma.com/captcha Thu, 29 Sep 2011 07:20:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/captcha <p>Spam is really a problem if you have a WordPress blog, a forum or a guestbook. A very common approach to solve this problem are CAPTCHAs - <strong>C</strong>ompletely <strong>A</strong>utomated <strong>P</strong>ublic <strong>T</strong>uring test to tell <strong>C</strong>omputers and <strong>H</strong>umans <strong>A</strong>part.</p> <p>The idea behind CAPTCHAs is to give the spammer a problem which is hard to solve for a computer program but easy to solve for a human.</p> <p>Most CAPTCHAs are really boring. I tried to find different categories of them, but most you will find online are in the &quot;Optical character recognition&quot; category:</p> <h2>Optical character recognition</h2> <div style="width: 310px" class="wp-caption aligncenter"><a href="../images/2011/09/Web-Wiz-CAPTCHA.png"><img src="../images/2011/09/Web-Wiz-CAPTCHA.png" alt="" width="310" height="155" class="size-full wp-image-2751"/></a><p class="wp-caption-text"></p></div> <p>I hope nobody seriously pays the 6 Euro for <a href="http://www.webwiz.co.uk/web-wiz-captcha/demo/">Web Wiz</a>. As many very simple CAPTCHAs it lacks a support for blind people. It is quite easy to read for humans, but I guess also for bots. They always use only five random characters which are written in blue. They added some dots and straight lines to make segmentation more difficult. I guess they never tried to hack their own CAPTCHA. If they did, they should be aware that those small dots don&#39;t change anything and the straight lines can easily be detected and removed. It also seems to me as if they only used one font.</p> <p>Google did some great work with <a href="http://www.google.com/recaptcha">reCAPTCHA</a>. I think I&#39;ll write a longer post about this later, but to keep it short: <ul> <li>They use the reader (or spammer) to digitalize the books they scan. So if someone uses very good algorithms to bypass their CAPTCHA, the spammer will help Google. This is a very nice way to end up in a win-win situation, isn&#39;t it?</li> <li>reCAPTCHA has also support for blind people.</li> <li>The characters you have to type in are actual words. This makes it a lot easier for humans to recognize the characters.</li> <li>reCAPTCHA is very easy to use. No need of <a href="http://php.net/manual/en/book.image.php">GD</a> or <a href="http://www.php.net/manual/en/book.imagick.php">ImageMagick</a>.</li> <li>If you can&#39;t read it, just reload it.</li> </ul> Here is a screenshot of reCAPTCHA: <div style="width: 338px" class="wp-caption aligncenter"><a href="../images/2011/09/reCAPTCHA.png"><img src="../images/2011/09/reCAPTCHA.png" alt="" width="338" height="175" class="size-full wp-image-2781"/></a><p class="wp-caption-text"></p></div></p> <p>Here is another &quot;traditional&quot; CAPTCHA example.</p> <div style="width: 219px" class="wp-caption aligncenter"><a href="../images/2011/09/SimpleCaptcha.png"><img src="../images/2011/09/SimpleCaptcha.png" alt="" width="219" height="65" class="size-full wp-image-2831"/></a><p class="wp-caption-text"></p></div> <h2>KittenAuth</h2> <p>I have never seen a working demo of <a href="http://thepcspy.com/kittenauth/">KittenAuth</a>, but the idea is simple: You get 9 pictures and you&#39;re supposed to spot the cats: <div style="width: 382px" class="wp-caption aligncenter"><a href="../images/2011/09/kittenAuth-captcha.jpg"><img src="../images/2011/09/kittenAuth-captcha.jpg" alt="" width="382" height="387" class="size-full wp-image-2891"/></a><p class="wp-caption-text"></p></div></p> <p>Very simmiliar is <a href="http://research.microsoft.com/en-us/um/redmond/projects/asirra/">ASIRRA</a>: <div style="width: 549px" class="wp-caption aligncenter"><a href="../images/2011/09/ASIRRA.png"><img src="../images/2011/09/ASIRRA.png" alt="" width="549" height="511" class="size-full wp-image-2941"/></a><p class="wp-caption-text"></p></div></p> <h2>Basic human knowledge</h2> <p>Another CAPTCHA-type is based on basic human knowledge. <a href="http://textcaptcha.com/">Text CAPTCHA</a> is an example for this type. They ask you questions like: <ul> <li>Which of milk, hotel or brain is a body part?</li> <li>How many letters in &quot;devotional&quot;?</li> <li>The word &quot;tamers&quot; has which letter in 2nd position?</li> <li>Enter the smallest number of 28, thirteen, twenty, 60, fifty six or 78:</li> <li>Which of knee, leg, ear or ankle is above the waist?</li> </ul></p> <p>I don&#39;t think this type is very good as the spammer has to do almost the same amount of work as the programmer. He has to parse the different types of questions, but I guess this isn&#39;t too hard.</p> <p>He might just ask Google: <a href="http://www.google.com/search?q=what+is+7+minus+3+times+2%3F">what is 7 minus 3 times 2?</a> or <a href="http://www.google.com/search?q=the+number+of+horns+on+a+unicorn#sclient=psy-ab&hl=de&source=hp&q=what+is+the+number+of+horns+on+a+unicorn+times+the+answer+to+life%2C+the+universe%2C+and+everything%3F&pbx=1&oq=what+is+the+number+of+horns+on+a+unicorn+times+the+answer+to+life%2C+the+universe%2C+and+everything%3F&aq=f&aqi=&aql=&gs_sm=e&gs_upl=15192l15192l2l15913l1l1l0l0l0l0l281l281l2-1l1l0&bav=on.2,or.r_gc.r_pw.r_cp.&fp=1f755a13a5fe778&biw=1366&bih=630">what is the number of horns on a unicorn times the answer to life, the universe, and everything?</a>.</p> <div style="width: 256px" class="wp-caption aligncenter"><a href="../images/2011/09/egglue-Egglue-Semantic-CAPTCHA.png"><img src="../images/2011/09/egglue-Egglue-Semantic-CAPTCHA.png" alt="" width="256" height="143" class="size-full wp-image-2801"/></a><p class="wp-caption-text"></p></div> <h2>Mathematics</h2> <p>I&#39;ve seen some CAPTCHAs asking for very basic math questions like the following one. They are very easy to bypass if you want to write a bot:</p> <div style="width: 212px" class="wp-caption aligncenter"><a href="../images/2011/09/CAPTCHA-Basic-mathematics.png"><img src="../images/2011/09/CAPTCHA-Basic-mathematics.png" alt="" width="212" height="52" class="size-full wp-image-2761"/></a><p class="wp-caption-text"></p></div> <p>Sometimes they are not that easy: <div style="width: 520px" class="wp-caption aligncenter"><a href="../images/2011/09/Rosocosmos.jpg"><img src="../images/2011/09/Rosocosmos.jpg" alt="" width="520" height="294" class="size-full wp-image-2901"/></a><p class="wp-caption-text"></p></div></p> <div style="width: 356px" class="wp-caption aligncenter"><a href="../images/2011/09/Hard-math-CAPTCHA.png"><img src="../images/2011/09/Hard-math-CAPTCHA.png" alt="" width="356" height="207" class="size-full wp-image-2921"/></a><p class="wp-caption-text"></p></div> <h2>Social CAPTCHA</h2> <p>I&#39;ve just found Facebooks social CAPTCHA. I didn&#39;t read <a href="http://blog.facebook.com/blog.php?post=486790652130">the article</a>. I guess the idea is that you know the name of your friends, but a stranger doesn&#39;t. I had the same idea for a school website where you would have been forced to know the name of the teachers. Here is the example: <div style="width: 539px" class="wp-caption aligncenter"><a href="../images/2011/09/Social-CAPTCHA.png"><img src="../images/2011/09/Social-CAPTCHA.png" alt="" width="539" height="266" class="size-full wp-image-2851"/></a><p class="wp-caption-text"></p></div></p> <h2>PLAYTHRU</h2> <p>To get through this CAPTCHA, you have to play a short game.</p> <div style="width: 360px" class="wp-caption aligncenter"><a href="../images/2011/09/playthru-1.png"><img src="../images/2011/09/playthru-1.png" alt="" width="360" height="160" class="size-full wp-image-43001"/></a><p class="wp-caption-text"></p></div> <div style="width: 360px" class="wp-caption aligncenter"><a href="../images/2011/09/playthru-2.png"><img src="../images/2011/09/playthru-2.png" alt="" width="360" height="160" class="size-full wp-image-43011"/></a><p class="wp-caption-text"></p></div> <p>You can get <a href="http://areyouahuman.com/">PLAYTHRU</a> here.</p> <h2>Further reading</h2> <ul> <li>Fun: <ul> <li>xkcd: <a href="http://xkcd.com/233/">A New CAPTCHA Approach</a></li> <li><a href="http://www.smosh.com/smosh-pit/photos/24-wtf-captchas">24 WTF Captchas</a></li> <li><a href="http://www.smosh.com/PC/smosh-pit/photos/25-very-naughty-facebook-captchas">25 Very Naughty Facebook Captchas</a></li> </ul> </li> <li>Free CAPTCHA systems: <ul> <li><a href="http://www.google.com/recaptcha">reCAPTCHA</a>: I recommend this one.</li> <li><a href="http://code.google.com/p/cool-php-captcha/">cool php captcha</a></li> <li><a href="http://www.1stwebdesigner.com/freebies/captcha-solutions-kill-spam/">Fight with Spam: 15+ Free Captcha Solutions</a></li> </ul> </li> <li>Breaking or creating CAPTCHAs: <ul> <li><a href="http://www.blackhat-seo.com/2008/how-to-break-captchas/">How to break captchas</a></li> <li><a href="http://caca.zoy.org/wiki/PWNtcha">PWNtcha</a></li> <li><a href="http://www.scribd.com/doc/24497942/Strong-CAPTCHA-Guidelines-v1-2">Strong CAPTCHA Guidelines</a></li> </ul> </li> </ul> Shortfilms http://martin-thoma.com/shortfilms Wed, 28 Sep 2011 10:05:29 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/shortfilms <div class="info">Here is the second part "<a href="../shortfilms-part-ii/">Shortfilms, Part II</a>".</div> <h2>Turbo</h2> <iframe src="http://player.vimeo.com/video/6932347?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p>TURBO is a high adrenaline short film in the tradition of The Karate Kid and Tron. It tells the story of Hugo Park (<a href="http://en.wikipedia.org/wiki/Justin_Chon">Justin Chon</a>, Twilight) a troubled youth whose only outlet for angst is a 4D fighting videogame called &ldquo;Super Turbo Arena&rdquo;. When Pharaoh King (<a href="http://en.wikipedia.org/wiki/Jocko_Sims">Jocko Sims</a>, Crash the Series), the Michael Jordan of cyber-sports, announces a tournament to determine who will join his pro-team, Hugo sets his eyes on the prize. But, Hugo isn't the only gamer who wants fame and glory. If Hugo wants to win he's going to have to beat Shamus (David Lehre, Epic Movie), the all time Turbo champ at the local Pandemonium arcade, and Ruse Kapri, a feisty prep girl that knows how to win. Realizing he can't win on his skill alone, Hugo turns to his brother Tobias a former kick-boxer whose last match left him wheel-chair ridden. Together the two will mend old wounds and see if a washed up street fighter can teach a troubled teen how to become a virtual gladiator!</p> Here is the <a href="http://www.imdb.com/title/tt1448608/">imdb-entry</a>. <h2>The Raven</h2> <iframe src="http://player.vimeo.com/video/11099712?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p>THE RAVEN<br /> <br /> Chris Black possesses a power that could lead to the destruction of the current regime, and they will stop at nothing to destroy him. <br /> The chase is on as Chris runs for his life in this sci-fi thriller set in an alternate and futuristic Los Angeles.</p> Here is the <a href="http://www.imdb.com/title/tt1646231/">imdb-entry</a>. <h2>The Cat Piano</h2> <iframe src="http://player.vimeo.com/video/3985019?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe> <p>Here is the <a href="http://www.imdb.com/title/tt1401657/">imdb-entry</a>.</p> <h2>The Ghastly Gourmet Cooking Show</h2> <iframe src="http://player.vimeo.com/video/4739045?title=0&amp;byline=0&amp;portrait=0" width="512" height="384" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p>Who do you call when there's a catering catastrophe? The Ghastly Gourmet team of course! Chip, Chop and Chunk are three beastly little chefs who can make a meal of (and out of) any situation, no matter how monstrous the request. It's a gleefully gross cooking show not for the feint hearted or weak stomached!</p> <h2>Karma Currency - Charity Gift Vouchers</h2> <iframe src="http://player.vimeo.com/video/2366178?title=0&amp;byline=0&amp;portrait=0" width="512" height="289" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe> <h2>Sebastian's Voodoo</h2> <p><iframe src="http://player.vimeo.com/video/3534334?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p>A voodoo doll must find the courage to save his friends from being pinned to death.</p></p> <h2>On Time</h2> <p><iframe src="http://player.vimeo.com/video/1198048?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p>A travelling salesman selling the future in his suitcase.</p></p> 10 Great Videos on Vimeo http://martin-thoma.com/10-great-videos-on-vimeo Wed, 28 Sep 2011 09:55:23 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/10-great-videos-on-vimeo <p>Vimeo is a video-sharing website like YouTube. The most obvious difference is the quality.</p> <p>Vimeo has over 3 million members.</p> <p>About 16,000 new videos get uploaded daily.</p> <p>Roughly 10% of all uploads are in HD.</p> <p>Here are 10 Great Videos I&#39;ve found on Vimeo:</p> <h2>Ben Goldacre: Bad Science</h2> <iframe src="http://player.vimeo.com/video/17889555?title=0&amp;byline=0&amp;portrait=0&amp;color=006666" width="512" height="288" frameborder="0"></iframe> <h2>Thought of You</h2> <iframe src="http://player.vimeo.com/video/14803194?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="512" height="288" frameborder="0"></iframe> <h2>Captain Awesome</h2> <iframe src="http://player.vimeo.com/video/18047390?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>The Saga of Biorn</h2> <iframe src="http://player.vimeo.com/video/18011143?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>The Blackwater Gospel</h2> <iframe src="http://player.vimeo.com/video/17914974?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>Aurora Borealis</h2> <iframe src="http://player.vimeo.com/video/16917950?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>Iceland, Eyjafjallaj&ouml;kull</h2> <iframe src="http://player.vimeo.com/video/11673745?title=0&amp;byline=0&amp;portrait=0" width="512" height="256" frameborder="0"></iframe> <h2>Rabbitkadabra!</h2> <iframe src="http://player.vimeo.com/video/24192252?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>Eye Of The Storm</h2> <iframe src="http://player.vimeo.com/video/19659763?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2>Salesman Pete</h2> <iframe src="http://player.vimeo.com/video/15126262?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> Lolcats: Hermes' Favorite Activity http://martin-thoma.com/lolcats-hermes-favorite-activity Mon, 26 Sep 2011 07:45:45 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/lolcats-hermes-favorite-activity <p>Cats are sometimes so crazy.</p> <p>This cat obviously loves beeing thrown on a bed.</p> <p>Have fun with the Lolcat-Clip:</p> <iframe width="560" height="315" src="http://www.youtube.com/embed/kYSoy71ib7A?rel=0" frameborder="0" allowfullscreen></iframe> Game: Winterbells http://martin-thoma.com/game-winterbells Sun, 25 Sep 2011 08:12:43 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/game-winterbells <p><b>Go to the Game</b>: <a href="http://www.ferryhalim.com/orisinal/g3/bells.htm" rel="nofollow">www.ferryhalim.com</a> <b>Task</b>: Jump at as many bells / pigeons with your arctic hare as possible <b>How to play</b>: The arctic hare jumps automatically. You choose the direction in which he jumps / flies with your mouse. <b>My Record</b>: 44,960</p> <p>If you thought that was good, just watch this video: <iframe title="YouTube video player" width="512" height="414" src="http://www.youtube.com/embed/mcrMDeeERks?rel=0&amp;hd=1" frameborder="0" allowfullscreen></iframe></p> Game: Lightbot 2.0 http://martin-thoma.com/game-lightbot-2-0 Sun, 25 Sep 2011 08:08:27 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/game-lightbot-2-0 <div style="width: 300px" class="wp-caption aligncenter"><a href="../images/2011/09/Lightbot-2.0-300x171.png"><img src="../images/2011/09/Lightbot-2.0-300x171.png" alt="" width="300" height="171" class="size-medium wp-image-2171"/></a><p class="wp-caption-text"></p></div> <p><b>Go to the Game</b>: <a href="http://www.kongregate.com/games/Coolio_Niato/lighbot-2-0">Lightbot 2.0 on Kongregate</a> <b>Task</b>: Solve the levels <b>How to play</b>: You can programm the Lightbot to move, jump and to switch its light on. By defining functions and using recursion you can keep your program code small. It&#39;s a nice online game where you can start to learn programming. <b>My Record</b>: All Basic and Recursion-Levels done.</p> Using Wikipedia as a Newssstream http://martin-thoma.com/using-wikipedia-as-a-newssstream Sat, 24 Sep 2011 21:21:23 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/using-wikipedia-as-a-newssstream <p>I am very interested in the development of Google+. As I am also quite active on Wikipedia (just take a look at my <a href="http://toolserver.org/~soxred93/pcount/index.php?name=MartinThoma&lang=de&wiki=wikipedia">edit counter</a>) I add all topics in which I am interested in to my personal watchlist. I added the RSS-Feed to my feed reader. So I get instantly a little pop-up as soon as the article changes. Great.</p> <p>...</p> <p>if there wouldn&#39;t be so many reverts / minor edits. Most edits I get informed of are either bot-edits (The article is now available in Tiếng Việt! Fantastic!) or simply reverted after a few hours.</p> <p>I&#39;m searching for a tool which reads my feed and generates a new feed. This new feed should contain only messages when relevant changes were made. Does something like this already exist? Does somebody want to invent such a web service? </p> <p>At the moment I don&#39;t have the time to do it myself, so I tagged this post with &quot;idea&quot;. If you&#39;re searching for an idea for a new project, just take a look at those topics.</p> Joke: Electrical Engineering vs. Computer Science http://martin-thoma.com/joke-electrical-engineering-vs-computer-science Sat, 24 Sep 2011 20:29:05 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/joke-electrical-engineering-vs-computer-science <div style="width: 128px" class="wp-caption alignright"><a href="../images/2011/09/Nerd-Crossing.jpg"><img src="../images/2011/09/Nerd-Crossing.jpg" alt="" width="128" height="127" class="size-full wp-image-2071"/></a><p class="wp-caption-text"></p></div> <p>I&#39;ve just stumbled upon this joke on <a href="http://wilk4.com/humor/humore2.htm">wilk4.com</a>. This is the reason why I didn&#39;t use OOP in any of my (small) projects and why I don&#39;t understand those people who want every piece of code in OOP-style:</p> <p>Once upon a time, in a kingdom not far from here, a king summoned two of his advisors for a test. He showed them both a shiny metal box with two slots in the top, a control knob, and a lever. &quot;What do you think this is?&quot;</p> <p>One advisor, an <strong>engineer</strong>, answered first. &quot;It is a toaster,&quot; he said. The king asked, &quot;How would you design an embedded computer for it?&quot; The engineer replied, &quot;Using a four-bit microcontroller, I would write a simple program that reads the darkness knob and quantizes its position to one of 16 shades of darkness, from snow white to coal black. The program would use that darkness level as the index to a 16-element table of initial timer values. Then it would turn on the heating elements and start the timer with the initial value selected from the table. At the end of the time delay, it would turn off the heat and pop up the toast. Come back next week, and I&#39;ll show you a working prototype.&quot;</p> <p>The second advisor, a <strong>computer scientist</strong>, immediately recognized the danger of such short-sighted thinking. He said, &quot;Toasters don&#39;t just turn bread into toast, they are also used to warm frozen waffles. What you see before you is really a breakfast food cooker. As the subjects of your kingdom become more sophisticated, they will demand more capabilities. They will need a breakfast food cooker that can also cook sausage, fry bacon, and make scrambled eggs. A toaster that only makes toast will soon be obsolete. If we don&#39;t look to the future, we will have to completely redesign the toaster in just a few years.&quot;</p> <p>&quot;With this in mind, we can formulate a more intelligent solution to the problem. First, create a class of breakfast foods. Specialize this class into subclasses: grains, pork, and poultry. The specialization process should be repeated with grains divided into toast, muffins, pancakes, and waffles; pork divided into sausage, links, and bacon; and poultry divided into scrambled eggs, hard- boiled eggs, poached eggs, fried eggs, and various omelet classes.&quot;</p> <p>&quot;The ham and cheese omelet class is worth special attention because it must inherit characteristics from the pork, dairy, and poultry classes. Thus, we see that the problem cannot be properly solved without multiple inheritance. At run time, the program must create the proper object and send a message to the object that says, &#39;Cook yourself.&#39; The semantics of this message depend, of course, on the kind of object, so they have a different meaning to a piece of toast than to scrambled eggs.&quot;</p> <p>&quot;Reviewing the process so far, we see that the analysis phase has revealed that the primary requirement is to cook any kind of breakfast food. In the design phase, we have discovered some derived requirements. Specifically, we need an object-oriented language with multiple inheritance. Of course, users don&#39;t want the eggs to get cold while the bacon is frying, so concurrent processing is required, too.&quot;</p> <p>&quot;We must not forget the user interface. The lever that lowers the food lacks versatility, and the darkness knob is confusing. Users won&#39;t buy the product unless it has a user-friendly, graphical interface. When the breakfast cooker is plugged in, users should see a cowboy boot on the screen. Users click on it, and the message &#39;Booting UNIX v.8.3&#39; appears on the screen. (UNIX 8.3 should be out by the time the product gets to the market.) Users can pull down a menu and click on the foods they want to cook.&quot;</p> <p>&quot;Having made the wise decision of specifying the software first in the design phase, all that remains is to pick an adequate hardware platform for the implementation phase. An Intel 80386 with 8MB of memory, a 30MB hard disk, and a VGA monitor should be sufficient. If you select a multitasking, object oriented language that supports multiple inheritance and has a built-in GUI, writing the program will be a snap. (Imagine the difficulty we would have had if we had foolishly allowed a hardware-first design strategy to lock us into a four-bit microcontroller!).&quot;</p> <p>The king wisely had the computer scientist beheaded, and they all lived happily ever after.</p> Google Ngram Viewer http://martin-thoma.com/google-ngram-viewer Sat, 24 Sep 2011 17:02:34 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/google-ngram-viewer <p>On October 14, 2010 Google announced that the number of scanned books is over 15 million. They did not simply scan those books, but they digitalized them. They can access not only image files, but the actual text. This allowes Google to search in those books and to analyse the information.</p> <p>Google has processed 1,024,908,267,229 words of running text and is publishing the counts for all 1,176,470,663 five-word sequences that appear at least 40 times. One five-word-sequence would be a five-gram, a four-word-sequence a four-gram.</p> <p>Google has published the Ngram Viewer. This is a tool which allows the user to specify some Ngrams and search how often they appear over the years.</p> <p>Here is an example search:</p> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Google-Ngram-Viewer-germany-france-300x113.png"><img src="../images/2011/09/Google-Ngram-Viewer-germany-france-300x113.png" alt="" width="300" height="113" class="size-medium wp-image-1971"/></a><p class="wp-caption-text"></p></div> <p>The x-axis shows the years, the y-axis shows the percentage of the specified ngram of all ngrams. Don&#39;t bother with the numbers. If one curve is higher than the other, more books contained the specified Ngram.</p> <p>My example shows that the term &quot;France&quot; was more often in books than &quot;Germany&quot;. Why is this the case? My first thought was that in the time of the two world wars more books should have been written about Germany. The answer is simply that I wrote &quot;germany&quot; instead of &quot;Germany&quot;. So it&#39;s case sensitive:</p> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Google-Ngram-Viewer-Germany-France-Third-Reich-300x112.png"><img src="../images/2011/09/Google-Ngram-Viewer-Germany-France-Third-Reich-300x112.png" alt="" width="300" height="112" class="size-medium wp-image-1981"/></a><p class="wp-caption-text"></p></div> <p>You can compare how successfull some books are: <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Google-Ngram-Viewer-Harry-Potter-Lord-of-the-Rings-The-Da-Vinci-Code-300x112.png"><img src="../images/2011/09/Google-Ngram-Viewer-Harry-Potter-Lord-of-the-Rings-The-Da-Vinci-Code-300x112.png" alt="" width="300" height="112" class="size-medium wp-image-2001"/></a><p class="wp-caption-text"></p></div></p> <p>Quite interesting is also the interest in famous physicists: <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Google-Ngram-Viewer-Physics-300x113.png"><img src="../images/2011/09/Google-Ngram-Viewer-Physics-300x113.png" alt="" width="300" height="113" class="size-medium wp-image-2011"/></a><p class="wp-caption-text"></p></div></p> <p>You can try all sort of things: <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Google-Ngram-Viewer-Happy-300x111.png"><img src="../images/2011/09/Google-Ngram-Viewer-Happy-300x111.png" alt="" width="300" height="111" class="size-medium wp-image-2031"/></a><p class="wp-caption-text"></p></div></p> <p>Did you get some interesting results? Please post a link!</p> <h2>Sources</h2> <ul> <li><a title="Google Books" href="http://en.wikipedia.org/wiki/Google_Books">Google Books</a>. Recieved 24 September 2011.</li> <li><a href="http://googleresearch.blogspot.com/2006/08/all-our-n-gram-are-belong-to-you.html">All Our N-gram are Belong to You</a>. Recieved 24 September 2011.</li> <li>Video: <a href="http://www.ted.com/talks/what_we_learned_from_5_million_books.html">What we learned from 5 million books</a>.</li> </ul> Python: Check Wiki-references for citation template http://martin-thoma.com/python-check-wiki-references-for-citation-template Sat, 24 Sep 2011 09:39:40 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/python-check-wiki-references-for-citation-template <p>Wikipedia articles are full of references. Those references should be formatted the same way. It is much easier to use a template for citations than trying to guess the right way how to cite. Unfortunately most wikipedia users don&#39;t know the <a href="http://en.wikipedia.org/wiki/Template:Citation" title="Template:Citation">Template:Citation</a>. </p> <p>So I try to fix all manual styled citations when I edit an article. Doing this manually is quite time intensive. This is the reason why I wrote a little Python-script.</p> <h2>Examples</h2> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;ref&gt;</span>[http://peter.mapledesign.co.uk/weblog/archives/python-is-slow Python is... slow?] December 21st, 2004 <span class="ni">&amp;mdash;</span> Peter Bowyer<span class="ni">&amp;rsquo;</span>s weblog]<span class="nt">&lt;/ref&gt;</span> </code></pre></div> <p>should be </p> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;ref&gt;</span>{{Citation |url=http://peter.mapledesign.co.uk/weblog/archives/python-is-slow |title=Python is... slow? |accessdate=September 24, 2011}}<span class="nt">&lt;/ref&gt;</span> </code></pre></div><div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;ref&gt;</span>[http://www.nongnu.org/pydbc/ Contracts for Python], PyDBC<span class="nt">&lt;/ref&gt;</span> </code></pre></div> <p>should be </p> <div class="highlight"><pre><code class="html language-html" data-lang="html"><span class="nt">&lt;ref&gt;</span>{{Citation |url=http://www.nongnu.org/pydbc/ |title=Contracts for Python |accessdate=September 24, 2011}}<span class="nt">&lt;/ref&gt;</span> </code></pre></div> <p>So, all that has to be done is <ol> <li>Finding all <ref>-Tags without a template in one article</li> <li>Trying to find the URL of this reference</li> <li>Filling out as much as possible for the user</li> <li>Asking the user for missing information</li> <li>Returning the new article wiki source code</li> </ol></p> <h2>Downloading wiki source code</h2> <p>Wikipedia offers an <a href="http://en.wikipedia.org/w/api.php" title="Wikipedia API">API</a> for accessing the needed information. I will use this API and Pythons <a href="http://docs.python.org/library/optparse.html">optparse</a>, <a href="http://www.crummy.com/software/BeautifulSoup/documentation.html">BeautifulSoup</a> and <a href="http://docs.python.org/library/htmlparser.html">HTMLParser</a> to get the raw wiki text in UTF-8 encoding:</p> <script src="https://gist.github.com/5555251.js"> </script> <p>We are now able to access the needed information. Now we need to get the references without templates. To do so, I will use the <a href="http://docs.python.org/library/re.html">Python re module</a>:</p> <script src="https://gist.github.com/5555251.js"> </script> <p>Here is the full script: <script src="https://gist.github.com/5555251.js"> </script></p> <p>This can be improved in several ways: <ul> <li>Checking automatically the title / dead links</li> <li>Trying to find the publication date automatically</li> <li>Skip links with <a href="http://en.wikipedia.org/wiki/Template:Dead_link" title="Template:Dead link">Templade:Dead link</a></li> <li>Search also for <ref name="xyz">Text</ref></li> </ul></p> <p>Here is the <a href="http://en.wikipedia.org/w/index.php?title=Python_%28programming_language%29&action=historysubmit&diff=452167384&oldid=452164712">Wikipedia diff page</a>. My little script seems to work.</p> PHP: PEAR MDB2 http://martin-thoma.com/pear-db Fri, 23 Sep 2011 23:38:35 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/pear-db <p>PEAR is short for <strong>P</strong>HP <strong>E</strong>xtension and <strong>A</strong>pplication <strong>R</strong>epository. It provides a very easy method to get some common classes.</p> <p>PEAR MDB2 is a database class. It is a successor of PEAR DB. I took a look at version 1.4.1 which is currently the latest stable one.</p> <h2>Install PEAR</h2> <p>You can install PEAR on Ubuntu via</p> <div class="highlight"><pre><code class="bash">sudo apt-get install php-pear </code></pre></div> <p>You can check if it is installed with <a href="http://php.net/manual/en/function.phpinfo.php">phpinfo()</a>: [php]&lt;?php phpinfo();?&gt;[/php]</p> <p>Something like <strong>.:/usr/share/php:/usr/share/pear</strong> should be in your <strong>include_path</strong>.</p> <h2>Install PEAR MDB2</h2> <p>PEAR MDB2 is then simply installed via</p> <div class="highlight"><pre><code class="bash">sudo pear install MDB2 </code></pre></div> <p>Then install the optional MySQL package:</p> <div class="highlight"><pre><code class="bash">sudo pear install pear/MDB2#mysql </code></pre></div> <h2>Usage</h2> <p>I took a small chess database to test this package. You can set it up with <a href="http://code.google.com/p/community-chess/source/browse/trunk/install/chess.sql?spec=svn99&r=98">this sql file</a>.</p> <p>It&#39;s sad, but only including <strong>MDB2.php</strong> shows 5 &quot;Deprecated&quot;-messages and 6 warings because of &quot;Strict Standards&quot;.</p> <p>You can easily connect to the database: [php]require_once &quot;MDB2.php&quot;;</p> <p><code>$db = new MDB2(); $</code>dsn = &quot;mysql://chessuser:localpass@localhost/chess&quot;; <code>$mdb2 = MDB2::factory($</code>dsn); `$mdb2-&gt;setFetchMode(MDB2<em>FETCHMODE</em>ASSOC);[/php]</p> <p>It is also very easy to fetch some data: [php]$<code>sql = &#39;SELECT * FROM</code>chess<em>users<code>&#39;; </code>$result = $<code>mdb2-&gt;query(</code>$sql); while ($<code>row =</code>$result-&gt;fetchRow()) { print</em>r($<code>row); }[/php] or [php]</code>$sql = &#39;SELECT * FROM <code>chess_users</code>&#39;; $<code>data =</code>$mdb2-&gt;queryAll($<code>sql); print_r(</code>$data);[/php]</p> <p>This results in:</p> <div class="highlight"><pre><code class="text">Array ( [user_id] =&gt; 1 [user_name] =&gt; abc [user_password] =&gt; 900150983cd24fb0d6963f7d28e17f72 [currentchesssoftware] =&gt; 0 ) Array ( [user_id] =&gt; 2 [user_name] =&gt; test [user_password] =&gt; 098f6bcd4621d373cade4e832627b4f6 [currentchesssoftware] =&gt; 0 ) </code></pre></div> <p>You can set limits via MDB2: [php]$<code>sql = &#39;SELECT * FROM</code>chess<em>users<code>&#39;; </code>$mdb2-&gt;setLimit(1); $<code>data =</code>$mdb2-&gt;queryAll($`sql); print</em>r($data);[/php]</p> <p>MDB2 offers lots of other features like choosing a (non)persistent connection, prepared statements or debuggin option. If you&#39;re interested in PEAR MDB2 I recommend to take a look at installationwiki.org.</p> <h2>Sources</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/PEAR" title="PEAR">PEAR</a>. Recieved 24 September 2011.</li> <li><a href="http://pear.php.net/package/MDB2" title="PEAR MDB2">PEAR MDB2</a>. Recieved 24 September 2011.</li> <li><a href="http://www.installationwiki.org/MDB2">MDB2</a> on installationwiki.org. Recieved 24 September 2011.</li> </ul> Data Visualization http://martin-thoma.com/data-visualization Fri, 23 Sep 2011 17:32:15 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/data-visualization <p>The United States public debt increased from `$10.7 trillion in 2008 to \$`14.2 trillion by February 2011. Google processes about 24 petabytes of data per day. About 21.9 people live in Mumbai.</p> <p>Today it is incredibly easy to gain raw data, but without context they aren&#39;t worth anything. You have to know some different information of the same context with which you can compare the given information.</p> <p>If I told you that 24 petabytes equals approximately 1,600 years of a high quality video you can get a feeling for the information. This can be done even better if you use graphical elements. </p> <p>Here are two great examples of data visualization.</p> <h2>David McCandless</h2> <p><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"> </param> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always"/> <param name="wmode" value="transparent"> </param> <param name="bgColor" value="#ffffff"> </param> <param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/DavidMcCandless_2010G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/DavidMcCandless-2010G.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=937&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=david_mccandless_the_beauty_of_data_visualization;year=2010;theme=presentation_innovation;theme=design_like_you_give_a_damn;theme=the_creative_spark;theme=a_taste_of_tedglobal_2010;event=TEDGlobal+2010;tag=Design;tag=complexity;tag=computers;tag=data;tag=visualizations;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /> <embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/DavidMcCandless_2010G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/DavidMcCandless-2010G.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=937&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=david_mccandless_the_beauty_of_data_visualization;year=2010;theme=presentation_innovation;theme=design_like_you_give_a_damn;theme=the_creative_spark;theme=a_taste_of_tedglobal_2010;event=TEDGlobal+2010;tag=Design;tag=complexity;tag=computers;tag=data;tag=visualizations;"></embed></object></p> <h2>Hans Rosling</h2> <p><object width="334" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"> </param> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always"/> <param name="wmode" value="transparent"> </param> <param name="bgColor" value="#ffffff"> </param> <param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/HansRosling_2006-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/HansRosling-2006.embed_thumbnail.jpg&vw=320&vh=240&ap=0&ti=92&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=hans_rosling_shows_the_best_stats_you_ve_ever_seen;year=2006;theme=technology_history_and_destiny;theme=unconventional_explanations;theme=women_reshaping_the_world;theme=rethinking_poverty;theme=numbers_at_play;theme=presentation_innovation;event=TED2006;tag=Global+Issues;tag=Google;tag=africa;tag=asia;tag=demo;tag=development;tag=economics;tag=health;tag=statistics;tag=visualizations;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /> <embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="334" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/HansRosling_2006-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/HansRosling-2006.embed_thumbnail.jpg&vw=320&vh=240&ap=0&ti=92&lang=&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=hans_rosling_shows_the_best_stats_you_ve_ever_seen;year=2006;theme=technology_history_and_destiny;theme=unconventional_explanations;theme=women_reshaping_the_world;theme=rethinking_poverty;theme=numbers_at_play;theme=presentation_innovation;event=TED2006;tag=Global+Issues;tag=Google;tag=africa;tag=asia;tag=demo;tag=development;tag=economics;tag=health;tag=statistics;tag=visualizations;"></embed></object></p> <h2>Sources and furhter reading</h2> <ul> <li><a href="http://www.gapminder.org/">Gapminder</a>: A tool for data visualization.</li> <li><a href="http://en.wikipedia.org/wiki/United_States_public_debt">United States public debt.</a> Recieved 23 September 2011.</li> <li><a href="http://dl.acm.org/citation.cfm?doid=1327452.1327492" title="MapReduce">MapReduce.</a> Portal.acm.org. Retrieved 16 August 2009.</li> <li><a href="http://en.wikipedia.org/wiki/Mumbai" title="Mumbai">Mumbai.</a> Recieved 23 September 2009.</li> </ul> Cleverbot vs. Wolfram|Alpha http://martin-thoma.com/cleverbot-vs-wolframalpha Fri, 23 Sep 2011 09:46:31 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/cleverbot-vs-wolframalpha <p><a href="http://cleverbot.com/" title="Cleverbot">Cleverbot</a> is an AI web application. You can chat with it and it tries to guess a good answer. This can be quite funny.</p> <p>I was curious how Cleverbot would answer when I compared it to <a href="http://www.wolframalpha.com/" title="answer engine">Wolfram|Alpha</a>, a useful answering engine. </p> <p>Here are two of my conversations:</p> <div class="separator" style="clear: both; text-align: center;"> <a href="../images/2011/09/Cleverbot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="../images/2011/09/Cleverbot.png/Cleverbot-thumb.png" width="196" /></a></div> <div class="separator" style="clear: both; text-align: center;"> <a href="../images/2011/09/Cleverbot-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="../images/2011/09/Cleverbot-2-thumb.png" width="201" /></a></div> <p>This Cleverbot isn&#39;t very clever...</p> <p>Did you get some funny chats? Please post a link to a screenshot of your chat!</p> Getting Hardware Information in Ubuntu http://martin-thoma.com/getting-hardware-information-in-ubuntu Thu, 22 Sep 2011 18:44:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/getting-hardware-information-in-ubuntu <p>I&#39;m using Ubuntu now for many years, but I always have to look the commands for retrieving hardware information up. Now I will not Google any longer but search in my own little cheat sheet.</p> <p>I guess most commands will work in every Linux distribution, but I tried it only in Ubuntu 10.04LTS.</p> <p>Maybe you need to install some packages.</p> <p>If you know more commands, please post a comment!</p> <h2>CPU</h2> <div class="highlight"><pre><code class="bash">cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Pentium<span class="o">(</span>R<span class="o">)</span> Dual-Core CPU T4500 @ 2.30GHz stepping : 10 cpu MHz : 1200.000 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm bogomips : 4588.23 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Pentium<span class="o">(</span>R<span class="o">)</span> Dual-Core CPU T4500 @ 2.30GHz stepping : 10 cpu MHz : 1200.000 cache size : 1024 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm bogomips : 4588.44 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: </code></pre></div> <h2>RAM</h2> <div class="highlight"><pre><code class="bash">free total used free shared buffers cached Mem: 4047112 1712724 2334388 0 94328 744808 -/+ buffers/cache: 873588 3173524 Swap: 8864760 0 8864760 </code></pre></div> <h2>Graphic card</h2> <div class="highlight"><pre><code class="bash">lspci <span class="p">|</span> grep VGA 00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller <span class="o">(</span>rev 07<span class="o">)</span> </code></pre></div> <p>And some more details:</p> <div class="highlight"><pre><code class="bash">lspci -s 00:02.0 -v 00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller <span class="o">(</span>rev 07<span class="o">)</span> Subsystem: Acer Incorporated <span class="o">[</span>ALI<span class="o">]</span> Device 048a Flags: bus master, fast devsel, latency 0, IRQ 29 Memory at d0000000 <span class="o">(</span>64-bit, non-prefetchable<span class="o">)</span> <span class="o">[</span><span class="nv">size</span><span class="o">=</span>4M<span class="o">]</span> Memory at c0000000 <span class="o">(</span>64-bit, prefetchable<span class="o">)</span> <span class="o">[</span><span class="nv">size</span><span class="o">=</span>256M<span class="o">]</span> I/O ports at 4110 <span class="o">[</span><span class="nv">size</span><span class="o">=</span>8<span class="o">]</span> Capabilities: &lt;access denied&gt; Kernel driver in use: i915 Kernel modules: i915 </code></pre></div> <h2>Audio Chipset</h2> <div class="highlight"><pre><code class="bash">lspci <span class="p">|</span> grep Audio 00:1b.0 Audio device: Intel Corporation 82801I <span class="o">(</span>ICH9 Family<span class="o">)</span> HD Audio Controller <span class="o">(</span>rev 03<span class="o">)</span> </code></pre></div> <p>And some more details:</p> <div class="highlight"><pre><code class="bash">lspci -s 00:1b.0 -v 00:1b.0 Audio device: Intel Corporation 82801I <span class="o">(</span>ICH9 Family<span class="o">)</span> HD Audio Controller <span class="o">(</span>rev 03<span class="o">)</span> Subsystem: Acer Incorporated <span class="o">[</span>ALI<span class="o">]</span> Device 048a Flags: bus master, fast devsel, latency 0, IRQ 22 Memory at d6700000 <span class="o">(</span>64-bit, non-prefetchable<span class="o">)</span> <span class="o">[</span><span class="nv">size</span><span class="o">=</span>16K<span class="o">]</span> Capabilities: &lt;access denied&gt; Kernel driver in use: HDA Intel Kernel modules: snd-hda-intel </code></pre></div> <h2>Network Chipset</h2> <div class="highlight"><pre><code class="bash">lspci <span class="p">|</span> grep Network 04:00.0 Network controller: Atheros Communications Inc. AR9287 Wireless Network Adapter <span class="o">(</span>rev 01<span class="o">)</span> </code></pre></div> <p>Then get some more information:</p> <div class="highlight"><pre><code class="bash">lspci -s 04:00 -v 04:00.0 Network controller: Atheros Communications Inc. AR9287 Wireless Network Adapter <span class="o">(</span>rev 01<span class="o">)</span> Subsystem: Foxconn International, Inc. Device e034 Flags: bus master, fast devsel, latency 0, IRQ 17 Memory at d4600000 <span class="o">(</span>64-bit, non-prefetchable<span class="o">)</span> <span class="o">[</span><span class="nv">size</span><span class="o">=</span>64K<span class="o">]</span> Capabilities: &lt;access denied&gt; Kernel driver in use: ath9k Kernel modules: ath9k </code></pre></div> <h2>Monitor</h2> <p>The packages ddcprobe or xresprobe will help.</p> <h2>Hard disk</h2> <div class="highlight"><pre><code class="bash">df -H Dateisystem Gr<span class="p">&amp;</span>ouml<span class="p">;&amp;</span>szlig<span class="p">;</span>e Benut Verf Ben% Eingeh<span class="p">&amp;</span>auml<span class="p">;</span>ngt auf /dev/sda1 307G 28G 264G 10% / none 2,1G 320k 2,1G 1% /dev none 2,1G 934k 2,1G 1% /dev/shm none 2,1G 209k 2,1G 1% /var/run none 2,1G 0 2,1G 0% /var/lock none 2,1G 0 2,1G 0% /lib/init/rw </code></pre></div> Benchmarking PHP http://martin-thoma.com/benchmarking-php Thu, 22 Sep 2011 11:06:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/benchmarking-php <p>I used ApacheBenchmark (<a href="http://httpd.apache.org/docs/2.0/programs/ab.html" rel="nofollow">ab</a>) to make a few Benchmark tests I was interested in. </p> <p>If you like to view some more, go to <a href="http://www.phpbench.com/" rel="nofollow">www.phpbench.com</a>.</p> <p>The most important options are: <ul> <li>-n: Number of requests to perform</li> <li>-c: Number of multiple requests to make</li> </ul></p> <p>An empty file:</p> <div class="highlight"><pre><code class="bash">moose@pc07:~<span class="sb">`</span><span class="nv">$ </span>ab localhost/empty.php This is ApacheBench, Version 2.3 <span class="p">&amp;</span>amp<span class="p">;</span>lt<span class="p">;</span><span class="nv">$`</span>Revision: 655654 <span class="sb">`</span><span class="nv">$&amp;</span>amp<span class="p">;</span>gt<span class="p">;</span> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost <span class="o">(</span>be patient<span class="o">)</span>.....done Server Software: Apache/2.2.14 Server Hostname: localhost Server Port: 80 Document Path: /empty.php Document Length: 0 bytes Concurrency Level: 1 Time taken <span class="k">for </span>tests: 0.002 seconds Complete requests: 1 Failed requests: 0 Write errors: 0 Total transferred: 210 bytes HTML transferred: 0 bytes Requests per second: 461.04 <span class="o">[</span><span class="c">#/sec] (mean)</span> Time per request: 2.169 <span class="o">[</span>ms<span class="o">]</span> <span class="o">(</span>mean<span class="o">)</span> Time per request: 2.169 <span class="o">[</span>ms<span class="o">]</span> <span class="o">(</span>mean, across all concurrent requests<span class="o">)</span> Transfer rate: 94.55 <span class="o">[</span>Kbytes/sec<span class="o">]</span> received Connection Times <span class="o">(</span>ms<span class="o">)</span> min mean<span class="o">[</span>+/-sd<span class="o">]</span> median max Connect: 0 0 0.0 0 0 Processing: 2 2 0.0 2 2 Waiting: 0 0 0.0 0 0 Total: 2 2 0.0 2 2 </code></pre></div> <p>Now I make 1000 requests to this empty file: </p> <div class="highlight"><pre><code class="bash">ab -n 1000 -c 1 localhost/empty.php </code></pre></div> <p>Time per request: 1.158 <a href="mean">ms</a></p> <p>With a document of two bytes, I get 1.324 ms. A HTML-Document with 300 kB has 4.287 ms.</p> <p>Now I&#39;ll begin the test I&#39;m interested in. It is related to <a href="http://stackoverflow.com/questions/4738605/undefined-offset-with-count" rel="nofollow">this Stackoverflow Question</a>. I&#39;ll make 10000 requests per Benchmark:</p> <p>[php]for($<code>i=0;</code>$i&lt;5; $<code>i++) { </code>$maximum = max( @count($<code>MyArray[</code>$i<em>7]), @count($<code>MyArray[</code>$i</em>7+1]), @count($<code>MyArray[</code>$i<em>7+2]), @count($<code>MyArray[</code>$i</em>7+3]), @count($<code>MyArray[</code>$i<em>7+4]), @count($<code>MyArray[</code>$i</em>7+5]), @count($<code>MyArray[</code>$i*7+6]) ); echo $`maximum.&#39; &#39;; } [/php] 1.817 ms </p> <p>[php]for(<code>$i=0; $</code>i<5; `$i++) { $`chunk = array_intersect_key(`$MyArray, array($`i*7=>1, <code>$i*7+1=&gt;2, $</code>i<em>7+2=&gt;3, <code>$i*7+3=&gt;4, $</code>i</em>7+4=&gt;5, <code>$i*7+5=&gt;6)); if(count($</code>chunk) &gt; 0){<code>$maximum = max(array_map(&#39;count&#39;, $</code>chunk));} else {<code>$maximum = 0;} echo $</code>maximum.&#39; &#39;; } [/php] 1.801 ms</p> <p>[php]for(<code>$i=0;$</code>i&lt;5;<code>$i++){ $</code>arr = array(); for (<code>$j=0;$</code>j&lt;=6;<code>$j++) { if (isset($</code>MyArray[<code>$i*7+$</code>j])) <code>$arr[] = count($</code>MyArray[<code>$i*7+$</code>j]); else {<code>$arr[] = 0;} } $</code>maximum = max(<code>$arr); echo $</code>maximum.&#39; &#39;; } [/php] 1.742 ms</p> Funny Commercials http://martin-thoma.com/funny-commercials Wed, 21 Sep 2011 20:24:17 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/funny-commercials <p>Those commercials are so funny! I have never seen commercials which are that funny in TV. Did you? Although I know some good IKEA commercials, I have never heard of most of the other companies.</p> <p>Enjoy the clips!</p> <h2>Dirt Devil</h2> <iframe src="http://player.vimeo.com/video/22984504?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2> Berlitz</h2> <iframe width="512" height="414" src="http://www.youtube.com/embed/pMhICbFn2JI" frameborder="0" allowfullscreen></iframe> <h2> Nando's</h2> <iframe width="512" height="321" src="http://www.youtube.com/embed/jsqosiEyGLs" frameborder="0" allowfullscreen></iframe> <h2> IKEA - Tidy Up</h2> <iframe width="512" height="414" src="http://www.youtube.com/embed/WzMuax75s3M" frameborder="0" allowfullscreen></iframe> <h2> Ameriquest</h2> <iframe width="512" height="414" src="http://www.youtube.com/embed/QOixDP-SdKw" frameborder="0" allowfullscreen></iframe> <p>Don&#39;t judge too fast!</p> <h2> Optician</h2> <iframe width="512" height="414" src="http://www.youtube.com/embed/RV6MZHRE3jU" frameborder="0" allowfullscreen></iframe> <h2> CPS</h2> <iframe width="512" height="321" src="http://www.youtube.com/embed/M_DCFHqVBIE" frameborder="0" allowfullscreen></iframe> <h2> Kellogs</h2> <iframe src="http://player.vimeo.com/video/8670278?title=0&amp;byline=0&amp;portrait=0" width="512" height="288" frameborder="0"></iframe> <h2> RWE</h2> <p>After a lot of criticism in Germany for beein environmental unfriendly because of operating nuclear power plants, RWE seems to have created this commercial: <iframe src="http://player.vimeo.com/video/6209117?title=0&amp;byline=0&amp;portrait=0" width="512" height="290" frameborder="0"></iframe></p> <h2> Other Blogposts</h2> <ul> <li><a href="http://koikoikoi.com/2010/11/30-most-brilliant-and-creative-condom-ads/">30 Most Brilliant and Creative Condom Ads</a></li> </ul> Browser Wars http://martin-thoma.com/browser-wars Wed, 21 Sep 2011 20:18:48 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/browser-wars <p>The Usage of different browser verions is very interesting for me. Internet Explorer 6 causes many problems in Webdesign as it doesn&#39;t handle CSS and HTML as it should. </p> <p>This might be the reason why <a href="http://ie6update.com/">many</a> <a href="http://www.ie6nomore.com/">Webdesigners</a> <a href="http://wordpress.org/extend/plugins/stop-ie6/screenshots/">want</a> <a href="http://www.ie6death.com/">IE6</a> to <a href="http://www.bringdownie6.com/">die</a>. </p> <p>(Before I forget it: Thanks to <a href="http://www.flickr.com/photos/jeffmcneill/5883030204/sizes/o/in/photostream/" title="jeffmcneill">jeffmcneill</a> for sharing this image as CC BY-SA.)</p> <p>As Google has stopped to support Internet Explorer 6 I hope the decline of its usage will speed up.</p> <p>Here are two cool websites, that track browser versions:</p> <h2>IE6 Countdown</h2> <div style="width: 500px" class="wp-caption alignnone"><a href="../images/2011/09/ie6countdown.png"><img src="../images/2011/09/ie6countdown.png" alt="" width="500" height="406" class="size-full wp-image-691"/></a><p class="wp-caption-text"></p></div> <h2>Stat Counter</h2> <p><div id="browser_version-na-monthly-201002-201102" width="600" height="400" style="width:600px; height: 400px;"></div>&lt;!-- You may change the values of width and height above to resize the chart --&gt;<p>Source: <a href="http://gs.statcounter.com/#browser_version-na-monthly-201002-201102">StatCounter Global Stats - Browser Version Market Share</a></p><script type="text/javascript" src="http://www.statcounter.com/js/FusionCharts.js"></script><script type="text/javascript" src="http://gs.statcounter.com/chart.php?browser_version-na-monthly-201002-201102"></script></p> <h2>See also</h2> <ul> <li><a href="http://en.wikipedia.org/wiki/Browser_war">Browser Wars</a></li> <li><a href="http://en.wikipedia.org/wiki/Usage_share_of_web_browsers">Usage share of web browsers</a></li> <li><a href="http://en.wikipedia.org/wiki/Comparison_of_web_browsers">Comparison of web browsers</a></li> <li><a href="http://en.wikipedia.org/wiki/Mozilla_Firefox">Mozilla Firefox</a></li> <li><a href="http://en.wikipedia.org/wiki/Google_Chrome">Google Chrome</a></li> <li><a href="http://en.wikipedia.org/wiki/Opera_(web_browser)">Opera</a></li> </ul> Converting Files with Linux http://martin-thoma.com/converting-files-with-linux Wed, 21 Sep 2011 20:10:08 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/converting-files-with-linux <p>The following tipps work under a Linux terminal and were tested with Ubuntu 10.04 LTS.</p> <p>I guess they will also work with other systems, as the programs are available for them.</p> <p>If you know some further file conversions, please let me know. </p> <p>I am also very interested in Web based conversions.</p> <h2>Image Files</h2> <p>If you want to change image files via terminal, <a href="http://en.wikipedia.org/wiki/ImageMagick" rel="nofollow">ImageMagick</a> is a good choice.</p> <p><b>Resize Images to a maximum resolution</b></p> <div class="highlight"><pre><code class="bash">convert <span class="s2">&quot;OldPicture.jpg&quot;</span> -resize 1600x1600 <span class="s2">&quot;NewPicture.jpg&quot;</span> </code></pre></div> <p><b>Create a Black-and-white picture and compress it</b>: </p> <div class="highlight"><pre><code class="bash">djpeg <span class="s2">&quot;OldPicture.jpg&quot;</span> <span class="p">|</span> ppmtopgm <span class="p">|</span> cjpeg -qual 70 &gt;<span class="s2">&quot;NewPicture.jpg&quot;</span> </code></pre></div> <p><b>Rename Pictures</b>:</p> <div class="highlight"><pre><code class="bash">rename -n <span class="p">&amp;</span>rsquo<span class="p">;</span>s/<span class="se">\.</span>jpg<span class="sb">`</span><span class="nv">$/</span><span class="se">\.</span>JPG/<span class="p">&amp;</span>rsquo<span class="p">;</span> *.jpg </code></pre></div> <h2>Audio Files</h2> <p><b>Give all mp3 songs the same sound level</b> (it&#39;s called <a href="http://en.wikipedia.org/wiki/Audio_normalization" rel="nofollow">Audio normalization</a>):</p> <div class="highlight"><pre><code class="bash">mp3gain -a *.mp3 </code></pre></div> <p><b>Merge many audio files to one</b>:</p> <div class="highlight"><pre><code class="bash">mp3wrap merged.mp3 one.mp3 two.mp3 </code></pre></div> <p><b>Convert all *.wav-files in one folder two *.mp3-files and remove the *.wav-files</b>:</p> <div class="highlight"><pre><code class="bash"><span class="k">for </span>i in *.wav<span class="p">;</span><span class="k">do </span>lame <span class="s2">&quot;$`i&quot;</span> <span class="s2">&quot;`${i%wav}mp3&quot;</span><span class="p">;</span> rm <span class="s2">&quot;$`i&quot;</span><span class="p">;</span> <span class="k">done</span> </code></pre></div> <h2> Video Files</h2> <p>For quite a lot purposes is the command line tool <a href="http://en.wikipedia.org/wiki/FFmpeg" rel="nofollow">FFmpeg</a> with its <a href="http://www.ffmpeg.org/ffmpeg-doc.html">lots of options</a> a good choice. For others might <a href="http://en.wikipedia.org/wiki/MEncoder" rel="nofollow">MEncoder</a> be better. You might also want to install some codecs first:</p> <div class="highlight"><pre><code class="bash">sudo apt-get install libavcodec-extra-52 libavdevice-extra-52 libavformat-extra-52 libavutil-extra-50 libpostproc-extra-51 libswscale-extra-0 libavcodec-unstripped-52 ubuntu-restricted-extras </code></pre></div> <p><b>Merge many video files to one</b>:</p> <div class="highlight"><pre><code class="bash">cat One.mpg Two.mpg Three.mpg <span class="p">|</span> ffmpeg -f mpeg -i - -vcodec copy -acodec copy <span class="s2">&quot;Merged.mpg&quot;</span> </code></pre></div> <p><b>avi2mpg</b>:</p> <div class="highlight"><pre><code class="bash">ffmpeg -i <span class="s2">&quot;Original.avi&quot;</span> <span class="s2">&quot;New.mpg&quot;</span> </code></pre></div> <p><b>mp42mpg</b>:</p> <div class="highlight"><pre><code class="bash">ffmpeg -i <span class="s2">&quot;Original.mp4&quot;</span> -target ntsc-vcd <span class="s2">&quot;New.mpg&quot;</span> </code></pre></div> <p><b>mod2avi</b>: ?</p> <p><b>vcd2avi</b>:</p> <div class="highlight"><pre><code class="bash">mencoder vcd://2 -o <span class="s2">&quot;New.avi&quot;</span> -oac copy -ovc lavc -lavcopts <span class="nv">vcodec</span><span class="o">=</span>mpeg4:vbitrate<span class="o">=</span>2000 </code></pre></div> <p><b>ogv2avi</b>:</p> <div class="highlight"><pre><code class="bash">mencoder <span class="s2">&quot;Original.ogv&quot;</span> -ovc xvid -oac mp3lame -xvidencopts <span class="nv">pass</span><span class="o">=</span>1 -o <span class="s2">&quot;New.avi&quot;</span> </code></pre></div> <p><b>wmv2mpg</b>: aspect=16/9 should eventually be changed to 4/3 or other aspects</p> <div class="highlight"><pre><code class="bash">mencoder -of avi -ofps 25 <span class="se">\</span> -oac mp3lame -lameopts cbr:br<span class="o">=</span>112:aq<span class="o">=</span>3:mode<span class="o">=</span>0:vol<span class="o">=</span>0 <span class="se">\</span> -vf hqdn3d,softskip,harddup <span class="se">\</span> -ovc xvid <span class="se">\</span> -xvidencopts <span class="nv">bitrate</span><span class="o">=</span>501:max_key_interval<span class="o">=</span>37:aspect<span class="o">=</span>16/9:turbo:nochroma_me:notrellis:max_bframes<span class="o">=</span>0:vhq<span class="o">=</span>0 <span class="se">\</span> Original.wmv <span class="se">\</span> -o New.avi </code></pre></div> <p><b>mkv2avi</b>:</p> <div class="highlight"><pre><code class="bash">mencoder <span class="s2">&quot;Original.mkv&quot;</span> -ovc lavc -lavcopts <span class="nv">vcodec</span><span class="o">=</span>mpeg4:vhq:vbitrate<span class="o">=</span>6000 -oac mp3lame -lameopts <span class="nv">vbr</span><span class="o">=</span>3 -o <span class="s2">&quot;New.avi&quot;</span> </code></pre></div> <h3>Converting Flash Videos flv to mpg</h3> <p>You might want to get the information of the video first:</p> <div class="highlight"><pre><code class="bash">ffmpeg -i inputVideo.flv </code></pre></div> <p>This is how you convert it:</p> <div class="highlight"><pre><code class="bash">ffmpeg -i inputVideo.flv -acodec libmp3lame -ab 64k -s 320x240 -r 24 outputVideo.mpg </code></pre></div> <p><strong>-i</strong> input file <strong>-acodec</strong> audio codec <strong>-ab</strong> audio bitrate <strong>-s</strong> size <strong>-r</strong> fps where fps is the frame rate in Hz. The default value is 25Hz.</p> <h3>Converting Flash Videos flv to avi</h3> <div class="highlight"><pre><code class="bash">ffmpeg -i inputVideo.flv -sameq -ab 128k outputVideo.avi </code></pre></div> <h2>Shortcuts for Linux Console</h2> <p>I convert svg2png or pdf2png quite often for my articles. So I&#39;ve created a command.</p> <p>You can create a command in Linux very easy: <ol> <li>Enter <code>echo $PATH</code> in your console</li> <li>Go to <code>/usr/bin</code> or any other path in your PATH</li> <li>Create a file with the name of your command (e.g. svg2png)</li> <li>Fill the fill (see below for some examples).</li> <li>Make it executable: <code>chmod +x svg2png</code></li> </ol></p> <p>My <code>svg2png</code> looks like this:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">argparse</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;convert a svg file to png&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="s">&quot;--input&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;input&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;read svg file&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-o&quot;</span><span class="p">,</span> <span class="s">&quot;--output&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;output&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;output png file&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-w&quot;</span><span class="p">,</span> <span class="s">&quot;--width&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;width&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;width of output png&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="kn">import</span> <span class="nn">os</span> <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;inkscape &quot;</span> <span class="o">+</span> <span class="n">args</span><span class="o">.</span><span class="n">input</span> <span class="o">+</span> \ <span class="s">&quot; -w &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">width</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; --export-png=&quot;</span> <span class="o">+</span> <span class="n">args</span><span class="o">.</span><span class="n">output</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Executed command: &quot;</span> <span class="o">+</span> <span class="n">command</span><span class="p">)</span> </code></pre></div> <p>My pdf2png looks like this:</p> <div class="highlight"><pre><code class="python"><span class="c">#!/usr/bin/env python</span> <span class="c"># -*- coding: utf-8 -*-</span> <span class="kn">import</span> <span class="nn">argparse</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s">&quot;convert a svg file to png&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-i&quot;</span><span class="p">,</span> <span class="s">&quot;--input&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;input&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;read svg file&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-o&quot;</span><span class="p">,</span> <span class="s">&quot;--output&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;output&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;output png file&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;FILE&quot;</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;-w&quot;</span><span class="p">,</span> <span class="s">&quot;--width&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;width&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">&quot;width of output png&quot;</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> <span class="kn">import</span> <span class="nn">os</span> <span class="n">commands</span><span class="o">=</span><span class="p">[]</span> <span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;pdf2svg &quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot; ~&quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot;.svg&quot;</span><span class="p">)</span> <span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;inkscape ~&quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot;.svg --export-plain-svg=~&quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot;.svg&quot;</span><span class="p">)</span> <span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;svg2png -i ~&quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot;.svg -o &quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">output</span><span class="o">+</span><span class="s">&quot; -w &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">width</span><span class="p">))</span> <span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;rm ~&quot;</span><span class="o">+</span><span class="n">args</span><span class="o">.</span><span class="n">input</span><span class="o">+</span><span class="s">&quot;.svg&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">command</span> <span class="ow">in</span> <span class="n">commands</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;Executed command: &quot;</span> <span class="o">+</span> <span class="n">command</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> </code></pre></div> Tricks with .htaccess http://martin-thoma.com/tricks-with-htaccess Wed, 21 Sep 2011 20:02:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/tricks-with-htaccess <p>If your Website is running on an Apache2 Webserver, you can change the behaviour of this server with .htaccess-files. </p> <p>Here are some examples:</p> <h2> Enable htaccess-files</h2> <p>Set <a href="http://httpd.apache.org/docs/2.0/mod/core.html#allowoverride" rel="nofollow">AllowOverride</a> to &quot;All&quot;:</p> <div class="highlight"><pre><code class="bash">sudo gedit /etc/apache2/sites-available/default </code></pre></div> <p>Restart Apache:</p> <div class="highlight"><pre><code class="bash">sudo /etc/init.d/apache2 reload </code></pre></div> <h2> Enable ExpiresOn / mod_rewrite</h2> <p>This is for Ubuntu:</p> <div class="highlight"><pre><code class="bash">sudo a2enmod rewrite expires sudo /etc/init.d/apache2 restart </code></pre></div> <h2> Prevent or allow directory listing</h2> <p>Add the following line to your .htaccess-file to allow directory listing:</p> <div class="highlight"><pre><code class="bash">Options +Indexes </code></pre></div> <p>Add the following line to your .htaccess-file to prevent directory listing:</p> <div class="highlight"><pre><code class="bash">Options -Indexes </code></pre></div> <h2> Prevent Hot Linking</h2> <div class="highlight"><pre><code class="bash">RewriteEngine on RewriteCond %<span class="o">{</span>HTTP_REFERER<span class="o">}</span> !^<span class="sb">`</span><span class="err">$</span> RewriteCond %<span class="o">{</span>HTTP_REFERER<span class="o">}</span> !^http://<span class="o">(</span>www.<span class="o">)</span>?your-domain.com/.*<span class="nv">$`</span> <span class="o">[</span>NC<span class="o">]</span> RewriteRule <span class="se">\.</span><span class="o">(</span>gif<span class="p">|</span>jpe?g<span class="p">|</span>png<span class="o">)</span><span class="sb">`</span><span class="nv">$ </span>- <span class="o">[</span>F<span class="o">]</span> </code></pre></div> <h2> Prevent Direct Access</h2> <p>If you include some files with PHP, you might want that others can&#39;t access this file directly. So add the following to your .htaccess-file:</p> <div class="highlight"><pre><code class="bash">&lt;FilesMatch <span class="s2">&quot;\.(inc)\.(php)$`&quot;</span>&gt; Order deny,allow Deny from all &lt;/FilesMatch&gt; &lt;FilesMatch <span class="s2">&quot;\.(tpl)$&quot;</span>&gt; Order deny,allow Deny from all &lt;/FilesMatch&gt; </code></pre></div> Ingenious Autocomplete http://martin-thoma.com/ingenious-autocomplete Wed, 21 Sep 2011 19:48:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/ingenious-autocomplete <p>Did you notice some strange autocomplete-results? Keep in mind that Google gets those suggestions by other searches. They don&#39;t employ someone who tries to guess what you mean. So many others have searched for the term which is suggested.</p> <p>Here are some I&#39;ve tested: <strong>Some nations:</strong> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-americans-are-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Autocomplete" src="../images/2011/09/autocomplete-americans-are.png" alt="Americans are ..." width="400" height="36" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-why-are-americans-so-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Why are Americans so ..." src="../images/2011/09/autocomplete-why-are-americans-so.png" alt="Why are Americans so ..." width="400" height="38" border="0" /></a></div> If you really like to know, you should go to <a href="http://en.wikipedia.org/wiki/Obesity#Causes">wikipedia</a>. They have an article about <a href="http://en.wikipedia.org/wiki/Obesity_in_the_United_States">Obesity in the United States</a>. I thought obesity would be a serious problem <a href="http://en.wikipedia.org/wiki/Obesity_in_Germany">in Germany</a>, too. According to wikipedia, Germany is only on rank 43 of the fattest nations. You can even find an article called &quot;<a href="http://en.wikipedia.org/wiki/Epidemiology_of_obesity">Epidemiology of obesity</a>&quot;. <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-canadians-a-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Canadians a..." src="../images/2011/09/autocomplete-canadians-a.png" alt="Canadians a..." width="400" height="39" border="0" /></a></div> I&#39;ve heard of this in <a href="http://en.wikipedia.org/wiki/How_i_met_your_mother">How I Met Your Mother</a>. <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-germans-are-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Germans are ..." src="../images/2011/09/autocomplete-germans-are.png" alt="Germans are ..." width="400" height="81" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-germany-is-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Germany is ..." src="../images/2011/09/autocomplete-germany-is.png" alt="Germany is ..." width="400" height="74" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-why-are-germans-so-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Why are Germans so ..." src="../images/2011/09/autocomplete-why-are-germans-so.png" alt="Why are Germans so ..." width="400" height="78" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-england-is-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="England is ..." src="../images/2011/09/autocomplete-england-is.png" alt="England is ..." width="400" height="47" border="0" /></a></div> <strong>Some systems:</strong> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-windows-is-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Windows is ..." src="../images/2011/09/autocomplete-windows-is.png" alt="Windows is ..." width="400" height="77" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-linux-is-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Linux is ..." src="../images/2011/09/autocomplete-linux-is.png" alt="Linux is ..." width="400" height="77" border="0" /></a></div> <a href="http://en.wikipedia.org/wiki/Apache_HTTP_Server">Apache</a> is one of the most common webservers. <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-mac-is-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Mac is ..." src="../images/2011/09/autocomplete-mac-is.png" alt="Mac is ..." width="400" height="79" border="0" /></a></div> <strong>And many others:</strong> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-can-je-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Can Jesus ..." src="../images/2011/09/autocomplete-can-je.png" alt="Can Jesus ..." width="400" height="82" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-can-you-get-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Can you get ..." src="../images/2011/09/autocomplete-can-you-get.png" alt="Can you get ..." width="400" height="79" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-chuck-norris-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Where ..." src="../images/2011/09/autocomplete-chuck-norris.png" alt="Where ..." width="400" height="77" border="0" /></a></div> You don&#39;t search for Chuck Norris, Chuck Norris finds you! <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-facebook-is-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Facebook is ..." src="../images/2011/09/autocomplete-facebook-is.png" alt="Facebook is ..." width="400" height="76" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-google-is-big.png"><img style="border-style: initial; border-color: initial; border-width: 0px;" title="Google is ..." src="../images/2011/09autocomplete-google-is.png" alt="Google is ..." width="400" height="76" border="0" /></a></div> I hope you have seen Terminator. Otherwise, you don&#39;t know <a href="http://en.wikipedia.org/wiki/Skynet_(Terminator)">Skynet</a>. <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-if-i-ate-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="If I ate ..." src="../images/2011/09/autocomplete-if-i-ate.png" alt="If I ate ..." width="400" height="37" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-i-really-h-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="I really h ..." src="../images/2011/09/autocomplete-i-really-h.png" alt="I really h ..." width="400" height="49" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-is-it-wrong-to-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Is it wrong to ..." src="../images/2011/09/autocomplete-is-it-wrong-to.png" alt="Is it wrong to ..." width="400" height="76" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-is-there-a-big.png"><img src="../images/2011/09/autocomplete-is-there-a.png" alt="" width="400" height="66" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-steve-jobs-is-big.png"><img src="../images/2011/09/autocomplete-steve-jobs-is.png" alt="" width="400" height="50" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-where-do-i-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Why do I ..." src="../images/2011/09/autocomplete-where-do-i.png" alt="Why do I ..." width="400" height="73" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/autocomplete-why-is-my-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Why is my ..." src="../images/2011/09/autocomplete-why-is-my.png" alt="Why is my ..." width="400" height="80" border="0" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="../images/2011/09/google-religion-is-big.png"><img class="alignnone" style="border-style: initial; border-color: initial; border-width: 0px;" title="Religion is ..." src="../images/2011/09/google-religion-is.png" alt="Religion is ..." width="400" height="82" border="0" /></a></div></p> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Autocomplete-I-hate-it-when-i-300x61.png"><img src="../images/2011/09/Autocomplete-I-hate-it-when-i-300x61.png" alt="" width="300" height="61" class="size-medium wp-image-1681"/></a><p class="wp-caption-text"></p></div> Epic Translation Fails http://martin-thoma.com/epic-translation-fails Wed, 21 Sep 2011 19:45:47 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/epic-translation-fails <p>Online translation programs are getting better and they are great if you want to get a vague idea of the content of a chinese website. Never the less you should know that the translations are not good enough by now:</p> <p>&quot;Spielzeugladen&quot; is German and means &quot;toy store&quot;</p> <div class="separator" style="clear: both; text-align: center;"> <img border="0" height="160" width="400" src="../images/2011/09/Google-Translator-Dirty-Picture.png" /></div> <p>Note the missing point.</p> <div class="separator" style="clear: both; text-align: center;"> <img border="0" height="193" width="400" src="../images/2011/09/Google-Translator-Was-hast-du-an.png" /></div> <p>&quot;Was hast du an?&quot; means &quot;What do you wear?&quot;</p> <div class="separator" style="clear: both; text-align: center;"> <img border="0" height="168" width="400" src="../images/2011/09/Google-Translator-Justin-Bieber-Puberty.png" /></div> <p>Did you know the Beatbox? Type &quot;pv zk pv pv zk pv zk zk pv pv pv zk pv zk zk pzk pzk pvzkpkzvpvzk kkkkkk bsch&quot;, translate from German to German and listen to it: <iframe width="512" height="321" src="http://www.youtube.com/embed/KtjYKMtGNRc" frameborder="0" allowfullscreen></iframe></p> <p>Here you can listen to the translation-song: <iframe width="512" height="321" src="http://www.youtube.com/embed/mqsrPNXEGdc" frameborder="0" allowfullscreen></iframe></p> 8 Animal Memes in Cyberculture http://martin-thoma.com/8-animal-memes-in-cyberculture Wed, 21 Sep 2011 19:43:12 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/8-animal-memes-in-cyberculture <p>Animals are quite often in some web memes: <h2>Lame Pun Coon</h2> <div style="width: 310px" class="wp-caption aligncenter"><a href="../images/2011/09/Lame-pun-coon.jpg"><img src="../images/2011/09/Lame-pun-coon.jpg" alt="" width="310" height="308" class="size-full wp-image-1001"/></a><p class="wp-caption-text"></p></div></p> <h2>Philosoraptor</h2> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Philosoraptor-300x300.jpg"><img src="../images/2011/09/Philosoraptor-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-381"/></a><p class="wp-caption-text"></p></div> <h2>Lolcat</h2> <p><object width="512" height="341" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="host=picasaweb.google.com&amp;hl=de&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fthemoosemind%2Falbumid%2F5444766564208572833%3Falt%3Drss%26kind%3Dphoto%26hl%3Dde" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><param name="src" value="http://picasaweb.google.com/s/c/bin/slideshow.swf" /><embed width="512" height="341" type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" flashvars="host=picasaweb.google.com&amp;hl=de&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fthemoosemind%2Falbumid%2F5444766564208572833%3Falt%3Drss%26kind%3Dphoto%26hl%3Dde" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object></p> <h2>Kung Fu Bear</h2> <div style="width: 320px" class="wp-caption alignnone"><a href="../images/2011/09/kungfu-bear.jpg"><img src="../images/2011/09/kungfu-bear.jpg" alt="" width="320" height="300" class="size-medium wp-image-381"/></a><p class="wp-caption-text"></p></div> <h2>Paranoid Parrot</h2> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Paranoid-Parrot-300x233.jpg"><img src="../images/2011/09/Paranoid-Parrot-300x233.jpg" alt="" width="300" height="233" class="size-medium wp-image-411"/></a><p class="wp-caption-text"></p></div> <h2>Socially Awkward Penguin</h2> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/Socially-Awkward-Penguin-300x300.jpg"><img src="../images/2011/09/Socially-Awkward-Penguin-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-421"/></a><p class="wp-caption-text"></p></div> <h2>Bachelor Frog</h2> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/bachelor-frog-300x295.png"><img src="../images/2011/09/bachelor-frog-300x295.png" alt="" width="300" height="295" class="size-medium wp-image-431"/></a><p class="wp-caption-text"></p></div> <h2>Courage Wolf</h2> <div style="width: 300px" class="wp-caption alignnone"><a href="../images/2011/09/courage-wolf-vs-zombies-300x300.jpg"><img src="../images/2011/09/courage-wolf-vs-zombies-300x300.jpg" alt="" width="300" height="300" class="size-medium wp-image-441"/></a><p class="wp-caption-text"></p></div> <p>Do you know more? Do you know some better ones of the described ones? Please, post a comment!</p> Animater vs. Animation http://martin-thoma.com/animater-vs-animation Wed, 21 Sep 2011 17:56:55 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/animater-vs-animation <p>An animator faces his own animation in deadly combat. The battlefield? The Flash interface itself. A stick figure is created by an animator with the intent to torture. The stick figure drawn by the animator will be using everything he can find - the brush tool, the eraser tool - to get back at his tormentor. It&#39;s resourcefulness versus power. Who will win? You can find out yourself. <iframe title="YouTube video player" width="512" height="414" src="http://www.youtube.com/embed/IF1heGQ3ttM" frameborder="0" allowfullscreen></iframe></p> <p>The Original Animator vs. Animation is from <a href="http://alanbecker.deviantart.com/art/Animator-vs-Animation-34244097">Alan Becker on Deviantart</a>.</p> 5 Online Comic Websites http://martin-thoma.com/online-comic-websites Wed, 21 Sep 2011 17:53:03 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/online-comic-websites <p>All of those Websites offer one small comic strip each day. Some of them are a bit geeky, so you might not understand them if you don&#39;t know anything about Linux / D&amp;D. <h2>xkcd</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/09/xkcd.png"><img src="../images/2011/09/xkcd.png" alt="<a href='http://xkcd.com/'>xkcd</a>&quot; width=&quot;320&quot; height=&quot;174&quot; class=&quot;size-medium&quot;/&gt;</a><p class="wp-caption-text"><a href='http://xkcd.com/'>xkcd</a></p></div></p> <h2>hijinks ensue</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/09/hijinksensue.png"><img src="../images/2011/09/hijinksensue.png" alt="<a href='http://hijinksensue.com/2011/01/11/failed-enterprises/' rel='nofollow'>www.hijinksensue.com</a>" width="320" height="174" class="size-medium"/></a><p class="wp-caption-text"><a href='http://hijinksensue.com/2011/01/11/failed-enterprises/' rel='nofollow'>www.hijinksensue.com</a></p></div> <h2>Penny Arcade</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/09/penny-arcade.png"><img src="../images/2011/09/penny-arcade.png" alt="<a href='http://www.penny-arcade.com/comic/2010/10/13/' rel='nofollow'>www.penny-arcade.com/comic</a>" width="320" height="174" class="size-medium"/></a><p class="wp-caption-text"><a href='http://www.penny-arcade.com/comic/2010/10/13/' rel='nofollow'>www.penny-arcade.com/comic</a></p></div> <h2>The Perry Bible Fellowship Comics</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/09/pbfcomics.png"><img src="../images/2011/09/pbfcomics.png" alt="<a href='http://www.pbfcomics.com/' rel='nofollow'>www.pbfcomics.com</a>" width="320" height="174" class="size-medium"/></a><p class="wp-caption-text"><a href='http://www.pbfcomics.com/' rel='nofollow'>www.pbfcomics.com</a></p></div> <h2>Realm of Atland</h2> <div style="width: 320px" class="wp-caption aligncenter"><a href="../images/2011/09/realm-of-atland.png"><img src="../images/2011/09/realm-of-atland.png" alt="<a href='http://www.realmofatland.com/?p=235' rel='nofollow'>www.realmofatland.com</a>" width="320" height="174" class="size-medium"/></a><p class="wp-caption-text"><a href='http://www.realmofatland.com/?p=235' rel='nofollow'>www.realmofatland.com</a></p></div> Freaky Wikipedia Articles http://martin-thoma.com/freaky-wikipedia-articles Wed, 21 Sep 2011 17:44:21 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/freaky-wikipedia-articles <p>Wikipedia has <a href="http://en.wikipedia.org/wiki/Special:Statistics" rel="nofollow">a lot of articles</a> (&gt; 3.7 million). Sometimes, people have <a href="http://en.wikipedia.org/wiki/Wikipedia:Deleted_articles_with_freaky_titles" rel="nofollow">funny ideas for redirections / new articles</a>:</p> <p><a href="http://en.wikipedia.org/wiki/Wikipedia:Redirects_for_discussion/Log/2008_September_24#Pitbull_with_Lipstick_.E2.86.92_Sarah_Palin" rel="nofollow">Pitbull with Lipstick</a> - redirected to <a href="http://en.wikipedia.org/wiki/Sarah_Palin" rel="nofollow">Sarah Palin</a></p> <p>The belief that a cosmic jewish zombie who was his own father can make you live forever if you symbolically eat his flesh and telepathically tell him you accept him as your master, so he can remove an evil force from your soul that is present in humanity(<a href="http://en.wikipedia.org/w/index.php?title=Special:Log/delete&amp;page=The_belief_that_a_cosmic_jewish_zombie_who_was_his_own_father_can_make_you_live_forever_if_you_symbolically_eat_his_flesh_and_telepathically_tell_him_you_accept_him_as_your_master,_so_he_can_remove_an_evil_force_from_your_soul_that_is_present_in_humanity" rel="nofollow">Source</a>) - Was a Redirect to <a href="http://en.wikipedia.org/wiki/Christianity" rel="nofollow">Christianity</a></p> <p><a href="http://en.wikipedia.org/w/index.php?title=Special:Log&amp;type=delete&amp;user=&amp;page=22.86+Centimetre+Nails" rel="nofollow">22.86 Centimetre Nails</a> was a redirect to <a href="http://en.wikipedia.org/wiki/Nine_Inch_Nails" rel="nofollow">Nine Inch Nails</a>. Comment: Trent Reznor is not likely to go metric any time soon. :D</p> <p><a href="http://en.wikipedia.org/w/index.php?title=Special:Log&amp;type=delete&amp;user=&amp;page=Category:Recursive+categories" rel="nofollow">Recursive categories</a> - joke page which subcategoried itself</p> <p><a href="http://en.wikipedia.org/w/index.php?title=Special:Log&amp;type=delete&amp;user=&amp;page=Noooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" rel="nofollow">Nooooooooooooooooooooooooooooooooooooooooooooooo[... 200 more ...]ooooooo</a> - a redirect to <a href="http://en.wikipedia.org/wiki/Darth_Vader" rel="nofollow">Darth Vader</a></p> Setting up WordPress http://martin-thoma.com/setting-up-wordpress Wed, 21 Sep 2011 17:36:18 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/setting-up-wordpress <p>This article is about creating a new WordPress blog. This includes installing and basic custominzation. </p> <p>You need to know how how to upload files and how your MySQL database credentials.</p> <p>I used almost the same setup and I will update this post if I make some bad experiences with it.</p> <h2>Requirements</h2> <h3>Minimum</h3> <p>Webserver with: <ul> <li>MySQL 5.0 or higher</li> <li>PHP 5.2.4 or higher</li> <li>10 MB free space</li> <li>Any possibility to upload files</li> </ul> <h3>Recommended</h3> <ul> <li>The <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod<em>rewrite</a> Apache module.</li> <li>An FTP-Client (e.g. FileZilla)</li> </ul> <h2>Installation</h2> <ol> <li>Download the latest version from <a href="http://wordpress.org/download/">wordpress.org</a></li> <li>Decompress it and submit it to your Webserver. It should be directly in your working directory. <small>Example: Use www.martin-thoma.com, not www.martin-thoma.com/wordpress/</small></li> <li>Run the installation setup <ol> <li>Fill in your database information <small>(database name, host, database user, database password)</small></li> <li>Store <span class="inline-file">wp-config.php</span> in your WordPress-Folder.</li> <li>Make the most basic configuration of your blog <small>(give it a title, create the admin account)</small></li> </ol> </li> </ol> <h2>Plugins</h2> <ol> <ul> <li><a href="http://akismet.com/">Akismet</a>: Protect your blog from spam. Don&#39;t forget to add your API Key.</li> <li><a href="http://wordpress.org/extend/plugins/sociable">Sociable</a>: A little, customizable link bar with icons to share the post on social networks. I miss Google+ :-(</li> <li><a href="http://wordpress.org/extend/plugins/syntaxhighlighter/">SyntaxHighlighter Evolved</a>: A syntax highliter. Absolutely necessary, if you want to write about code. If you don&#39;t write about code, you don&#39;t need it.</li> <li><a href="http://wordpress.org/extend/plugins/twitter-tools/">Twitter Tools</a>: a plugin that creates a complete integration between your WordPress blog and your Twitter account.</li> <li><a href="http://wordpress.org/extend/plugins/wordpress-seo/">WordPress SEO by Yoast</a>: XML-Sitemap, binding for Google/Bing Webmaster Tools</li> <li><a href="http://wordpress.org/extend/plugins/wp-piwik/">WP-Piwik</a>: Piwik is an OpenSource alternative to Google Analytics. You can get some information about your readers. Download the latest Piwik-Version <a href="http://piwik.org/">here</a> and install it on your Website. Don&#39;t forget to add your Auth token.</li> </ul> </ol> <h2>Configuration</h2> <ol> <ol> <li>Add the categories you want. <small>Go to Posts &rarr; Categories</small></li> <li>Set your default category. <small>Go to Settings &rarr; Writing</small></li> <li>Delete the &quot;Hello World!&quot; post.</li> <li>Delete &quot;Sample&quot; page.</li> <li>Set a default category in Settings &rarr; Writing. Then delete the category &quot;Uncategorized&quot;.</li> <li>Set up a custom theme. You can find free ones on <a href="http://wordpress.org/extend/themes">wordpress.org/extend/themes</a>.</li> <li>Use &lt;a href=&quot;http://codex.wordpress.org/Using</em>Permalinks&quot;&gt;Permalinks</a>. I use <span class="inline-code">/%postname%/</span> as I want short URLs. Another plus of this URL is that the URL never changes.</li> </ol> </ol> <h2>Finetuning</h2> <strong>www or non-www-URL</strong>: decide if you want www.martin-thoma.com or martin-thoma.com as your standard URL. Both should work, but one should redirect the user to the other. I choose to take martin-thoma.com as I like short URLs. Add this to your .htaccess if you want www.martin-thoma.com:</p> <div class="highlight"><pre><code class="bash">RewriteEngine on RewriteCond %<span class="o">{</span>HTTP_HOST<span class="o">}</span> !^www.martin-thoma.com<span class="sb">`</span><span class="err">$</span> RewriteRule ^<span class="o">(</span>.*<span class="o">)</span><span class="nv">$`</span> http://www.martin-thoma.com/<span class="nv">$1</span> <span class="o">[</span><span class="nv">R</span><span class="o">=</span>301<span class="o">]</span> </code></pre></div> <p><strong>Imprint</strong>: In Germany, you have to create an imprint. Even if you don&#39;t have to create one, I strongly recomment giving your readers the possibility to get to know who writes the posts. It gives you more credibility.</p> <h2>Piwik</h2> <ul> <li><a href="http://piwik.org/">Piwik</a></li> <li>Login &rarr; Geolocation tab &rarr; follow the instructions</li> </ul> <h2>Sources and further reading</h2> <ul> <li><a href="http://codex.wordpress.org/Using_Permalinks#Structure_Tags">Using Permalinks - Structure Tags.</a> Retrieved 17 September 2011.</li> <li><a href="http://www.jimwestergren.com/seo-for-wordpress-blogs/">SEO for WordPress &ndash; The Complete Guide.</a> Retrieved 17 September 2011.</li> </ul> Polyglots - Crazy Programming Stuff http://martin-thoma.com/polyglots-crazy-programming-stuff Wed, 21 Sep 2011 17:28:02 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/polyglots-crazy-programming-stuff <p>Have you ever heard of polyglots? This is sooo crazy. A <a href="http://en.wikipedia.org/wiki/Polyglot_(computing)">polyglot</a> is a program which can be interpreded as many programming languages. You don&#39;t believe me that something crazy like that is possible? Here is an example I&#39;ve made: </p> <div class="highlight"><pre><code class="python"> <span class="c">#&gt;++++++++++[</span> <span class="c"># Python code written by Martin Thoma</span> <span class="c">#&gt;++++++++</span> <span class="c">#&gt;++++++++++</span> <span class="c"># Looping</span> <span class="c">#&gt;+++++++++++</span> <span class="k">def</span> <span class="nf">looping</span><span class="p">(</span><span class="n">i</span><span class="p">):</span> <span class="sd">&quot;&quot;&quot;&gt;++++++++++++ Do some crazy stuff x Written by Martin Thoma &quot;&quot;&quot;</span> <span class="n">answer</span> <span class="o">=</span> <span class="s">&quot;&quot;</span> <span class="k">while</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">13</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="k">elif</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">:</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="k">elif</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">:</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="k">elif</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">15</span><span class="p">:</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="n">i</span> <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">96</span><span class="p">:</span> <span class="sd">&quot;&quot;&quot;+++++++++++&quot;&quot;&quot;</span> <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">122</span><span class="p">:</span> <span class="n">i</span> <span class="o">%=</span> <span class="mi">26</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">96</span> <span class="n">answer</span> <span class="o">=</span> <span class="n">answer</span><span class="o">+</span><span class="nb">chr</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="sd">&quot;&quot;&quot;+++++++++&gt;++++++++++&gt;++++++++++++&gt;++++++++++&gt;++++++++++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;+&gt;+++&gt;++++++++++&gt;+++++++++++&gt;++++++++++&gt;++++++++++&gt;+++&gt;++++++++++++&gt;++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;++++++++&gt;++++++++++++&gt;+++&gt;++++++++++++&gt;+++++++++++&gt;+++++++++++&gt;+++++++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;+++++&gt;++++++++++++&gt;++++++++++&gt;+++++++++++&gt;+++&gt;++++++++++&gt;++++++++++++&gt;&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;+++&gt;++++++++&gt;++++++++++&gt;+++++++++++&gt;++++++++++++&gt;+++++++++++&gt;+++++++++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;++&gt;+++&gt;++++++++&gt;++++++++++&gt;+++++++++++&gt;+++++++++++&gt;++++++++++&gt;+++++&gt;++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;+&gt;+++++++&gt;+++++++++++&gt;++++++++++&gt;++++++++++++&gt;++++++++++++&gt;++++&gt;+++&gt;++&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;++++++++&gt;++++++++++++&gt;++++++++++&gt;++++++&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;-]&gt;++++&gt;++++&gt;-----&gt;-----&gt;++&gt;----&gt;++++&gt;-&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;--&gt;-----&gt;&gt;++&gt;---&gt;-&gt;---&gt;++&gt;-&gt;+&gt;&gt;+&gt;++&gt;-&gt;---&gt;-----&gt;++&gt;-&gt;++++&gt;-----&gt;----&gt;-&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;---&gt;+&gt;&gt;++&gt;--&gt;+&gt;++&gt;---&gt;---&gt;++++&gt;----&gt;-----&gt;&gt;++&gt;++++&gt;++++&gt;+&gt;-&gt;---&gt;----&gt;+&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;+&gt;---&gt;++++&gt;---&gt;++&gt;+&gt;++++&gt;++&gt;++++&gt;---&gt;++++&gt;+++&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;.&gt;.&gt;. &gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&quot;&quot;&quot;</span> <span class="sd">&quot;&quot;&quot;&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&gt;.&quot;&quot;&quot;</span> <span class="k">return</span> <span class="n">answer</span> <span class="k">print</span> <span class="n">looping</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="s">&quot;You&#39;ve just executed some Python-Code written by Martin Thoma&quot;</span><span class="p">)</span> </code></pre></div> <p>You can download the file at <a href="../python/polyglot.py">martin-thoma.com/python/polyglot.py</a>.</p> <p>I used three languages in this piece of code: <a href="http://en.wikipedia.org/wiki/Python_(programming_language)">Python</a>, <a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> and <a href="http://en.wikipedia.org/wiki/Whitespace_(programming_language)">Whitespace</a>. You can try it with <a href="http://ideone.com/">ideone.com</a>. But please, copy the whole code!</p> <p>It might be considered as cheating to use comments as often as I did and using two esoteric programming languages. Whitespace works only with whitespaces (space, tab) and Brainfuck needs only +-.;&lt;&gt;[]. Everything else is interpreted as a comment.</p> <p>When I have much more freetime and I don&#39;t know what to do, I&#39;ll probably write some code with a more interesting output and which is not that obivous.</p> Imprint http://martin-thoma.com/imprint Wed, 21 Sep 2011 16:36:59 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/imprint <p>Martin Thoma Parkstra&szlig;e 17 76131 Karlsruhe</p> <p>mail: info@martin-thoma.de</p> <p>Verantwortlicher f&uuml;r die Inhalte des Angebots ist Martin Thoma.</p> About Me http://martin-thoma.com/about-martin-thoma Wed, 21 Sep 2011 16:35:30 +0000 info@martin-thoma.de (Martin Thoma) http://martin-thoma.com/about-martin-thoma <div style="width: 144px" class="wp-caption alignright"><a href="../images/2011/09/Martin_Thoma_web_thumb.jpg"><img class="size-full" title="Martin Thoma" src="../images/2011/09/Martin_Thoma_web_thumb.jpg" alt="Martin Thoma" width="134" height="200"></a><p class="wp-caption-text">Martin Thoma</p></div> <p>My name is Martin Thoma. I am a 22 year old student from Karlsruhe, Germany.</p> <p>Do you want to know more about me? I&#39;ve created a <a href="../pdf/cv-curriculum-vitae.pdf">short English CV</a> and&nbsp;<a href="http://www.martin-thoma.de/about.htm" rel="me">a longer German CV</a>.</p> <h2>Other Profiles</h2> <ul> <li><a href="https://plus.google.com/116515806655836046525/posts" rel="me">Google+</a></li> <li><a href="https://twitter.com/#!/themoosemind" rel="me">Twitter</a></li> </ul>